oracle的userenv和nls_lang详解
oracle的userenv和nls_lang详解
1、userenv最常见的使用
userenv函数返回当前会话(session)的相关信息。以下sql语句可以查询当前会话连接的数据库字符集
select userenv('language') from dual;
有关userenv('parameter')
返回值的官网介绍如下
意思就是:返回的是当前会话使用的language和territory。characterset是数据库的字符集。
下面我们就去验证这种情况
2、windows上plsql使用userenv
先看下数据库真实的语言、地区和字符集
再看下windows上NLS_LANG环境变量
最后看下plsql上userenv执行的结果
可以发现在windows上使用plsql的时候语言和地区使用的是plsql的环境变量NLS_LANG。
3、Linux上sqlplus使用userenv
首先看一下NLS_LANG为空的情况下userenv的返回值
可以看到userenv('language')
的返回值是AMERICAN_AMERICA.ZHS16GBK
。这个值是怎么来的呢?从Oracle官网上看是取的默认值,如下图
- 如果Oracle通用安装程序没有指定NLS_LANG,则默认值是
AMERICAN_AMERICA.US7ASCII
- 如果language没有指定,则language的默认值是
AMERICAN
- 如果territory没有指定,则territory的默认值由language这个值派生而来。
- 如果charset没有指定,则在创建session的时候charset的值是数据库的characterset。
- NLS_LANG的每一个component都是可选的,如果只想指定NLS_LANG的territory,那么需要这样指定:
NLS_LANG=_JAPAN
。此时territory的值是JAPAN
具体参见:Choosing a Locale with the NLS_LANG Environment Variable
下面继续验证
可以看到指定NLS_LANG之后,userenv('language')
从会话中取得的语言和地区发生了变化,但是字符集仍然取得的是数据库的字符集。
4、问题:中文乱码在哪个环节产生的?
由以上分析可知,不管是什么样的客户端程序(不管是plsql还是sqlplus),在创建会话的时候字符都是取数据库本身的字符集。因此客户端程序和session的字符集不一致的时候会产生转码。如果转码的过程中出现了字节损失,则存储的真实数据就是损失之后的数据。至于我们看到的乱码是因为存储的数据会在查询的时候再次转码成客户端程序的字符集,由于数据缺失,因此就乱码了。
至于中文乱码的验证可以参见【字符集】论Oracle字符集“转码”过程
- 基于模型的测试工具: Spec Explorer
- SQL常用数据库结构升级语句
- K2 blackpearl 中的业务规则(Rules)
- 胡泳:如果总想着和机器人竞争,你就已经输了
- VUE 入门基础(7)
- JSON 和 JSONP
- android 项目中出现红色感叹号的解决方法
- SharePoint Foundation 2010
- ASP.NET MVC Action Filters
- Android:StatFs类 获取系统/sdcard存储空间信息
- 数据挖掘干货
- 高效 Mac 人士必备:实现工作/家庭间网络环境切换的自动化
- android中AVD的使用
- ASP.NET MVC 2示例Tailspin Travel UI层分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 性能测试工具——wrk
- String - 67. Add Binary
- Math - 50. Pow(x, n)
- String - 44. Wildcard Matching
- DFS&BFS - 37. Sudoku Solver
- Array - 36. Valid Sudoku
- Array - 57. Insert Interval
- Binary Search - 378. Kth Smallest Element in a Sorted Matrix
- Array - 59. Spiral Matrix II
- Array - 54. Spiral Matrix
- String - 8. String to Integer (atoi)
- Array - 16. 3Sum Closest
- Array - 15. 3Sum
- Design - 146. LRU Cache
- LinkedList - 142. Linked List Cycle II