使用Oracle字符集时经常出现的问题及对策
使用Oracle字符集时经常出现的问题及对策
一、现象和由来
先说个有关Oracle的一个经典笑话:
几年前有一次,有位Oracle工程师在做语音查询时,用db_link做完连接查询调试通过后,即通知使用。吃完饭后,他做了个check,查询时惊讶地发现,所有字符全是“靠”,后立即与资深的Oracle系统工程师联系,立即改正了字符集,这才避免了一场纷争。
可见,不同字符集的乱码问题是十分常见和即需解决的问题,否则客户端的用户无法使用。
字符集乱码问题通常出现在:
1.新安装的不同版本客户端;
2.新安装的WEB服务器未经Oracle字符集配置,如用asp程序在任一台机中进行调用时;
3.导入新的数据库和用普通客户端导出数据库时。
现在我们不讨论字符集的种类,也不谈论字符集的的包含与子集关系,更不讨论多服务器不同字符集的乒乓开关的切换问题。仅讨论字符集不匹配时我们应该如何处理。
二、乱码问题出现时的解决之道
1.在sqlplus中,源(服务器)端和客户端(WEB服务器)的字符集查看方法是一致的,以DBA用户:
select * from sys.props$ where name='NLS_CHARACTERSET';
2.如果出现两端字符集不一致,即很容易在客户端出现乱码(客户端字符集不兼容或是小于关系),假如服务器端字符集为“US7ASCII”(全称为“AMERICAN_AMERICA.US7ASCII”),则修改客户端配置:
update sys.props$ set value$='AMERICAN_AMERICA.US7ASCII' where name='NLS_CHARACTERSET';
三、客户端在注册表中配置字符集的方法:
客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_LANG,则“新建”->“字符串”,重命名为“NLS_LANG”,赋值为:“AMERICAN_AMERICA.US7ASCII”。
四、注意问题
服务器端使用的字符集可在初始时update进行修改,也可以在init*.ora文件中定义,不再鳌述。
字符集一旦定义完成后,不要轻易修改,特别是服务器端。不适当的字符集可能使Oracle服务崩溃。
在此,仅以本人名义感谢必特-思维软件公司的同仁们。