前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >oracle的userenv和nls_lang详解

oracle的userenv和nls_lang详解

作者头像
职场亮哥
发布2020-10-10 10:55:25
2.2K0
发布2020-10-10 10:55:25
举报
文章被收录于专栏:职场亮哥

oracle的userenv和nls_lang详解

1、userenv最常见的使用

userenv函数返回当前会话(session)的相关信息。以下sql语句可以查询当前会话连接的数据库字符集

代码语言:javascript
复制
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字符集“转码”过程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • oracle的userenv和nls_lang详解
    • 1、userenv最常见的使用
      • 2、windows上plsql使用userenv
        • 3、Linux上sqlplus使用userenv
          • 4、问题:中文乱码在哪个环节产生的?
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档