oracle乱码问题

常用的字符集:

US7ASCII:只能存储美国人使用的字符,26个英文字母,数字,+-*/等等

ZHS16GBK:存储中国人常用的字符

UTF8:unicode字符集,存储全世界的字符,只是不全

AL32UTF8:unicode字符集,比UTF8大多了,unicode字符集使用它,全但性能较差

ALS16UTF16:国家字符集选择它

字符集一共有三种: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一定要设置成与操作系统字符集一致才不会出现中文乱码或者显示?的问题。

 

posted @ 2020-03-28 10:36  一了然  阅读(627)  评论(0)    收藏  举报