Oracle数据库字符集为WE8ISO8859P1存储中文和客户端程序展示中文问题

文章目录

现象

通常我们都用 ZHS16GBK
服务端:

select * from nls_database_parameters;
...
NLS_CHARACTERSET	ZHS16GBK
...

客户端:NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

但是某个客户的数据库为 WE8ISO8859P1
我们的客户端程序界面显示乱码:???

分析

客户端修改 NLS_LANG=american_america.WE8ISO8859P1
客户端程序界面显示继续乱码:操操操…
用TOAD界面在表中输入中文,输入法中是正常字符,写入数据库变乱码。

查了一下,有文章说服务端字符集如果不支持中文,则一定乱码:
但是他的系统是Linux并且是SQLPlus,不是自己开发的客户端程序。
参考:《Oracle字符集的简单图解,中文乱码解决》

问了客户,数据库字符集不能改,也不给我们新建数据库。。。

理论上Oracle存储的内容是字节,即使是中文被拆开2个字节存入Varchar2,也可以取出后组合成中文。

又查了下资料,都说服务端字符集应该和客户端显示无关。
主要是导入导出可能有字符集转换的问题。

解决

后来用PLSQL程序试了一下重新执行导入数据脚本,PLSQL里面中文显示正常了。。。再看客户端程序显示也正常了???

此时Oracle客户端和服务端都是WE8ISO8859P1。

再用TOAD试,依然乱码,呵呵哒。
TOAD现在虽然支持多个数据库,
但当年可是Tool of Oracle Administration and Developmen…
咋能这样呢。

结论

客户端和服务器都为单字节字符集,操作系统支持中文显示。
应用程序是可以显示中文的。

不过为了方便,我们最好还是把数据库建成中文字符集,或中文字符集的超集。

Guess you like

Origin blog.csdn.net/ddrfan/article/details/102832222