首页 下载说明 正文

oracle查看数据库字符集命令是什么?这里有详细解答!

哥几个,今天跟大家聊个我之前碰到的,挺烦心但是搞明白了的小事儿,就是怎么在Oracle里看数据库的字符集。这玩意儿,平时不觉得,一旦出问题,能要了你的命。

本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu

那会儿,公司里有个老项目,要往新系统那边倒数据。新系统是用Java写的,对字符编码要求比较高,必须得是UTF-8。老系统那边,数据库是Oracle,版本有点老了,那负责的兄弟又是个新人,稀里糊涂就干上了。结果数据一导过去,好家伙,新系统里一堆问号,全是乱码。当时我一看这情况,就知道八成是字符集没对上。

那会儿我虽然也用过Oracle,但对这种底层的东西真没太研究过。碰到这乱码问题,我心里就打鼓了,以前都是遇到啥查这回也一样。我第一个想到的就是,这肯定是数据库的设置问题。我想着数据库里应该有啥地方存着字符集信息?

我当时就坐下来,打开SQL Developer,连接上老系统的数据库。心里想着,这数据库肯定有自己的系统视图,记录着各种参数。我开始瞎蒙,想起了平时看系统状态会用到的一些V$开头的视图,比如`V$PARAMETER`什么的。我就试着跑了一句:

  • `SELECT FROM V$PARAMETER WHERE name LIKE '%nls%';`

这一查不要紧,出来一大堆数据,里面都是跟`NLS`相关的参数,什么`NLS_LANGUAGE`,`NLS_TERRITORY`,`NLS_SORT`,看得我眼花缭乱。虽然我知道`NLS`跟国际化有关系,但具体哪个是字符集,还真没一眼看出来。而且这个视图是显示当前session或者instance的参数,不是数据库本身的。

然后我又想起来,是不是有那种直接看数据库设置的参数?我尝试着用`SHOW PARAMETER NLS`,这个是SQLPlus里的命令,在SQL Developer里用不了,它会报错。后来我才意识到,我得找数据字典的视图,直接看数据库的元数据。

我当时在网上翻了一大堆资料,看来看去,发现好多人都在说`NLS_DATABASE_PARAMETERS`这个视图。我心里一动,觉得这名字听起来就靠谱,直指数据库参数嘛我就赶紧跑了一句:

  • `SELECT FROM NLS_DATABASE_PARAMETERS;`

这一跑,出来的结果就清晰多了!里面有各种`NLS`相关的参数,清清楚楚地写着。我一眼就看到了两个非常关键的参数:

  • `NLS_CHARACTERSET`:这个就是数据库本身的字符集,它决定了你的`VARCHAR2`、`CHAR`、`CLOB`这些类型的数据用什么编码存储。老项目的数据库一查,果然是`ZHS16GBK`,而新系统要的是`AL32UTF8`。 Bingo!问题找到了!
  • `NLS_NCHAR_CHARACTERSET`:这个是国家字符集,它管的是`NVARCHAR2`、`NCHAR`、`NCLOB`这些特殊的数据类型。一般情况,如果你的应用不专门用这些N开头的数据类型,这个可以先放一边。但了解下总是好的。

找到了这两个,我心里就有底了。原来,要看数据库的字符集,最直接、最准确的就是查`NLS_DATABASE_PARAMETERS`这个视图。特别是要定位到具体的值,可以这样查:

  • `SELECT value FROM NLS_DATABASE_PARAMETERS WHERE parameter = 'NLS_CHARACTERSET';`
  • `SELECT value FROM NLS_DATABASE_PARAMETERS WHERE parameter = 'NLS_NCHAR_CHARACTERSET';`

这两个命令一出来,结果就非常干净,直接告诉你数据库用的是哪个字符集。知道是`ZHS16GBK`之后,我就知道为啥新系统里是乱码了,因为GBK和UTF-8根本不兼容,直接显示就出问题。这时候,要么新系统兼容GBK,要么老系统数据导出的时候做字符集转换,或者干脆把老库的字符集改了(改数据库字符集是个大活儿,风险高,慎重)。

那次之后,我就把这两个命令牢牢记住了。每次遇到跟字符集有关的问题,或者新项目部署、数据迁移的时候,我都会先去检查一下数据库的`NLS_CHARACTERSET`和`NLS_NCHAR_CHARACTERSET`。这算是我的一个“标准操作”了,就跟开车前系安全带一样。

除了数据库本身的,还有实例和会话的字符集

后来我又多学了点,发现不光有数据库层面的字符集,还有实例(Instance)层面的和会话(Session)层面的。这就像一个层层嵌套的结构。

  • 实例字符集:这个是在数据库启动的时候加载的,可以影响到一些后台进程。查看命令是:
    `SELECT FROM NLS_INSTANCE_PARAMETERS;`
  • 会话字符集:这个是当前用户连接数据库的时候,可以设置的字符集。如果你用SQL Developer或者Navicat连接的时候,工具本身可能会带一个客户端字符集设置,这就是影响会话的。查看命令是:
    `SELECT FROM NLS_SESSION_PARAMETERS;`
  • 甚至还有个简单的,能看当前会话的语言环境:
    `SELECT USERENV('language') FROM DUAL;`

一般来说,最关键的就是数据库那个`NLS_CHARACTERSET`,这个是数据的根本。实例和会话的字符集,在没有明确设置或者客户端工具没有特殊配置的情况下,会默认继承数据库的。但要是出了乱码,查会话字符集也能帮你排查是不是客户端配置错了。

所以说,搞清楚这几个命令,你就能清清楚楚地知道你的Oracle数据库到底在用什么编码,下次再遇到乱码,你就知道该往哪个方向去排查了。这可比以前我那样瞎蒙,效率高太多了,简直事半功倍。