oracle的userenv和nls_lang详解

oracle的userenv和nls_lang详解

一、userenv最多见的使用

userenv函数返回当前会话(session)的相关信息。如下sql语句能够查询当前会话链接的数据库字符集linux

select userenv('language') from dual;

有关userenv('parameter')返回值的官网介绍以下程序员

意思就是:返回的是当前会话使用的language和territory。characterset是数据库的字符集。sql

下面咱们就去验证这种状况数据库

二、windows上plsql使用userenv

先看下数据库真实的语言、地区和字符集windows

再看下windows上NLS_LANG环境变量session

最后看下plsql上userenv执行的结果oracle

能够发如今windows上使用plsql的时候语言和地区使用的是plsql的环境变量NLS_LANG。ide

三、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')从会话中取得的语言和地区发生了变化,可是字符集仍然取得的是数据库的字符集。

四、问题:中文乱码在哪一个环节产生的?

由以上分析可知,无论是什么样的客户端程序(无论是plsql仍是sqlplus),在建立会话的时候字符都是取数据库自己的字符集。所以客户端程序和session的字符集不一致的时候会产生转码。若是转码的过程当中出现了字节损失,则存储的真实数据就是损失以后的数据。至于咱们看到的乱码是由于存储的数据会在查询的时候再次转码成客户端程序的字符集,因为数据缺失,所以就乱码了。

至于中文乱码的验证能够参见【字符集】论Oracle字符集“转码”过程



记得帮我点赞哦!

精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你须要的学习资料,还在等什么?快去关注下载吧!!!

resource-introduce

念念不忘,必有回响,小伙伴们帮我点个赞吧,很是感谢。

我是职场亮哥,YY高级软件工程师、四年工做经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

若是有幸能帮到你,请帮我点个【赞】,给个关注,若是能顺带评论给个鼓励,将不胜感激。

职场亮哥文章列表:更多文章

wechat-platform-guide-attention

本人全部文章、回答都与版权保护平台有合做,著做权归职场亮哥全部,未经受权,转载必究!

相关文章
相关标签/搜索