一. 首先确认你的linux是否设置了支持中文
cat /etc/sysconfig/i18n
其中:
LANG 变量是 language 的简称, 这个变量时决定系统的默认语言, 即系统菜单, 程序的工具栏语言, 输入法默认语言等.
SUPPORTED 变量是 决定系统支持的语言, 即系统能够显示的语言.
SYSFONT 变量是默认的系统字体.
其中 将LANG=“en_US.UTF-8”也是可以显示中文的.
二. 将 securCRT 中设置, 外观-> 字符编码设置成UTF-8 就可以输入中文了. (这部对于secuCRT显示中文是重要的, 上边的1主要是确认当前系统的语言系)
三. oracle 查询的结构, 显示的是问号 ?
虽然现在可以输入中文了, 也可以在 securCRT 的sqlplus下输入中文, 将data保存, 但是当你要显示的时候, 查询出来的却是问号, 但是当你指定 where name=”你好” 时, 数据库能够针对这个条件显示出1行数据, 注意只是1行, 说明查询条件起作用了, 只是显示的问题.
影响 oracle 数据库字符集最重要的参数是NLS_LANG 参数, 它的格式为:
NLS_LANG=languare_territory.charset 它由三部分组成(语言, 地域和字符集), 其中:
language 指定服务器消息语言,
territory 指定服务器的日期和数字格式
charset 指定字符集
例如 AMERICAN_AMERICA.ZHS16GBK
从NLS_LANG 的组成我们可以看出, 真正影响数据库字符集的其实是第三部分, 所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据, 前面影响的只是提示信息.
查询 server 端的字符集 : select userenv('language') from dual; -- 结果类似 AMERICAN_AMERICA.ZHS16GBK
查询 dmp 字符集(为了数据库之间的迁移) select nls_charset_name(to_number('0354','xxxx')) from dual; -- 结果类似 ZHS16GBK
查询 client 端字符集 : 在 windows 平台下, 就是注册表里相应 oracle home 的 NLS_LANG, 也可以在dos 里自己设置 set nls_lang=AMERICAN_AMERICA.ZHS16GBK, 这样就只影响这个窗口的环境变量.
在 unix 平台下, echo $NLS_LANG 可以看到字符集, 如果发现client 和 server 端字符集不一样, 就同意修改成 server 端字符集
字符集的转换时从子集到超集受支持. 如果两个字符集根本没有子集和超集的关系, 那么字符集的转换不受 oracle 支持. 另外不建议修改 oracle server 端的字符集.
有3个字符集
1. client 本身系统字符集
2. NLS_LANG 这个应用字符集 ( 比如你在客户端调用了 sqlplus , 那么这个应用会参考这个参数 )
3. server 端字符集
如果出现乱码, 解决方法是:
server 端字符集本身就是 AL32UTF8
将 NLS_LANG 字符集设置成 AL32UTF8 (如果不设置这个参数, 那么这个参数默认就是跟server 端相同的字符集)
将 client本身字符集, 例如 unix 平台的 LANG 设置成 AL32UTF8 或者 AL32UTF8 的子集, 就可以解决乱码问题
在 SG 对应章节, 有子集和超集对应关系表
步骤可以归纳为:1.找到操作系统使用的字符集,并按上表找到对应的字符集名称。2.修改客户端软件的字符集NLS_LANG环境变量设置