首先说一下环境,win8操作系统,服务端装的是oracle11g64位,客户端32位免安装版。
问题
安装oracle的时候选择的是utf8,然后把plsql和oracle配置好,可是在PLSQL中插入数据时,出现一个问题,PLSQL中的表里无法显示中文,中文无法保存、无法输出,中文在表中显示问号,如图:
原因分析
在客户端和服务器端都为utf-8时,假如你正确存入了汉字信息到数据库服务器上,一般来说汉字的UTF8的编码为三个byte。然后你的客户端也是utf-8, 那么不经过转换就会通过select 显示,比如“管”的假定的信息是185,220,148(这里是随意写的),但是你的客户端是否具有这样的字符集呢?一般的Windows操作系统是不会让你选择一种UTF8的字符集的,要么是GBK的简体中文,要么是美国标准英文,后者是windows系统的标准英文,或者是日文操作系统等,没有一种使用UTF8的显示和输入的操作系统。
事实上,Unicode编码主要是一种信息存储的编码方式。可以支持世界上主要的语言的所有字符都能够用一个唯一的编码值在表示和存储。在信息来显示和输入的时候,大家都还是使用各自的语言的。比如,一个网络在线商店,可以接受,中文的,泰问,日本专有字符,蒙古文的操作系统的输入的内容,统一转换成UTF8存储到数据中,然后各个操作系统要进行读取的时候,也分别按照UTF8到各自的操作系统编码转换进行读取。现在全世界还没有一种可以同时使用包含所有主要语言的操作系统,在Windows平台可以通过国家语言设置来进行转换(但是要么是选择中文版,好么是选择英文版,要么是蒙古文.... ,不能同时选择所有,否则我们的键盘的键格数量要大大增加),所以,没有将客户端设置为语言选择为UTF8的操作系统。
当客户端设置的字符集是gbk时,服务器端判断出两边的字符集不符合,所以会将gbk编码转换成utf-8的编码,同时客户端在读取时,会将utf-8的编码转成gbk编码,这样就保证了中文输入的正确性。
select dump('管') from dual,实际上表示的是你操作系统当前所使用的语言编码是GBK的,应为只有2个byte. 所以你的AMERICAN_AMERICA.ZHS16GBK只能选择ZHS16GBK, 永远不要选择为UTF8,只有你想执行数据库的字符集转换的时候,你在exp和imp的时候,为了exp数据的字符集变化,你可以临时让客户端和数据库段一致。但是几乎很少有从utf8这种unicode转换到非unicode的工作场景的。
解决办法
步骤一
开始-运行-输入regedit-回车进入注册表,依次单击HKEY_LOCAL_MACHINE--->SOFTWARE ---> ORACLE--->KEY_OraDb11g_home1(不同版本的Oracle显示的都不太一样,但都会包含home这个单词),找到“NLS_LANG”,查看数值数据是否为:“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”,如果不是就将它设置为“SIMPLIFIED CHINESE_CHINA.ZHS16GBK。”
如图
步骤二
设置完注册表后,接下来设置我们的环境变量,计算机(右键) --->属性--->高级系统设置--->高级--->环境变量--->新建,个人建议新建用户变量,变量名输入:“NLS_LANG”,变量值输入:“SIMPLIFIED CHINESE_CHINA.ZHS16GBK”。点击确定即可,到此我们就设置完了。问题解决
如图