前段时间在安装Teamcenter的时候出现了字符存储问题。字符到不是乱码,而是以奇怪的字母和数字进行存储。
开始以为是Oracle的配置问题,所以
1. 检测Oracle的database设置,输入
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
返回 ZHS16GBK,这说明Oracle服务器端的字符集配置为正确设置。
2. 接着输入
select userenv('language') from dual
返回 AMERICAN _ AMERICA. ZHS16GBK
这也不影响结果,前面两个参数只影响界面提示信息和货币日期格式等。
这说明我在创建database选择的字符集ZHS16GBK并没有错误。
3. 查询client端的字符集
打开注册表,查询“NLS_LANG” ,发现它在HKEY_LOCAL_MACHINE\Software\Oracle\HOME0下,修改其value为:
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
打开Teamcenter,发现还是不能正确显示。当时安装Teamcenter时,选择的默认字符集为EUN_CN,GB2312,这个也应该能正确显示中文才是。
后来在Oracle的数据库里找到了对应的存储表格,发现存储进database时字符已经变成了乱码。研究了半天,可能是Teamcenter调用了操作系统Windows的一下API,而本机的Windows是英文版的,安装的中文语言包的支持。这样可能在调用时系统的函数时采用的字符就不一样了。
本想绝望地安装中文操作系统时,找到了一个解决办法。
4. 在操作系统里设置系统环境变量 NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
然后Teamcenter里的内容就能正常显示了。
解决办法太莫名其妙了,暂且记之。
顺便,oracle里用sql*Worksheet 读出的中文也是乱码,但直接查看表格时却是正确的,这个的解决办法也很简单。
打开 $ORACLE_HOME\sysman\config\dbappscfg.properties 文件,
找到注释掉的这一句 # SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
添加一句
SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK即可。
参考链接: