oracle 的 userenv 和 nls_lang 详解
1、userenv 最常见的应用
userenv 函数返回以后会话(session)的相干信息。以下 sql 语句能够查问以后会话连贯的数据库字符集
select userenv('language') from dual;
无关 userenv('parameter')
返回值的官网介绍如下
意思就是:返回的是以后会话应用的 language 和 territory。characterset 是数据库的字符集。
上面咱们就去验证这种状况
<!–more–>
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 字符集“转码”过程
记得帮我点赞哦!
精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!
朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。
我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。
听我说,提高多,程序人生一把梭
如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。
职场亮哥文章列表:更多文章
自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!