昨天在虚拟机里新装了个Ubuntu,然后今天使用sql/plus时就出现了中文乱码问题,百度一番,终于解决了。
乱码现象如图:
搞定后如图:
常用的字符集:
US7ASCII:只能存储美国人使用的字符,26个英文字母,数字,+-*/等等
ZHS16GBK:存储中国人常用的字符
UTF8:unicode字符集,存储全世界的字符,只是不全
AL32UTF8:unicode字符集,比UTF8大多了,unicode字符集使用它,全但性能较差
ALS16UTF16:国家字符集选择它
注意:如果只是中国人使用,ZHS16GBK就足够了,如果是全世界都使用,就使用AL32UTF8
字符集一共有三种:a.操作系统字符集
b.Oracle数据库字符集
c.软件字符集
如果软件有字符集,就不会使用操作系统的字符集;如果没有字符集(比如SQL/PLUS就没有字符集),那么在输入和显示中文时就调用操作系统的字符集来进行编码。SQL/PLUS在输入中文以后,会调用操作系统的字符集将中文转化成编码,然后传递给Oracle数据库,Oracle数据库通过查看nls_language来获取操作系统使用的字符集,如果俩字符集是一致的,那么就会直接将编码存入Oracle数据库;如果不一致,Oracle数据库首先会用nls_lang所表明的字符集将编码转化成字符,然后用Oracle数据库自己的字符集将字符转化成编码存入数据库。总之,所有字符集的转化都是在Oracle端进行的,Oracle数据库在存储数据的时候一定是按照自己的字符集来存储的。
1. NLS_LANG 参数组成
NLS_LANG参数由以下部分组成:
NLS_LANG=<Language>_<Territory>.<Clients Characterset>
NLS_LANG各部分含义如下:
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
通常设置或者等于客户端(如Windows)代码页
或者对于unicode应用设置为UTF8
2查看 NLS_LANG 的方法
Windows使用:
echo %NLS_LANG%
Unix使用:
env|grep NLS_LANG
3. 查看数据库当前字符集参数设置
SELECT * FROM v$nls_parameters;
4. 查看数据库可用字符集参数设置
SELECT * FROM v$nls_valid_values;
5. 客户端 NLS_LANG 的设置方法
Windows:
# 常用中文字符集
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
# 常用unicode字符集
set NLS_LANG=american_america.AL32UTF8
Unix:
# 常用unicode字符集
export NLS_LANG=american_america.AL32UTF8
# 常用中文字符集
export NLS_LANG="Simplified Chinese_china".ZHS16GBK
可以编辑 bash_profile 文件进行永久设置
vi .bash_profile
NLS_LANG="Simplified Chinese_china".ZHS16GBK export NLS_LANG
# 使 bash_profile 设置生效
source .bash_profile
6.出现乱码可能存在的原因:
存储错误的字符编码
存储正确的字符编码,但nls_lang设置错了
7.解决方法:
操作系统常用的字符集一共两种,一种是UTF8,还有一种就是中文。windows通过chcp命令来查询操作系统所使用的字符集,如果现实"活动代码页:936",就表示操作系统使用的字符集是中文,这时只要将nls_lang通过Set nls_lang=american_america.zhs16gbk命令设置成GBK即可,总之,NLS_LANG一定要设置成与操作系统字符集一致才不会出现中文乱码或者显示?的问题。
参考资料:
欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;