我的oracle版本是11g,在linux上安装。客户端是xp。
现在,通过PL / SQL查询数据和中文问号;像这样(字段名称):
在pl / sql执行命令中:“从双重选择userenv('language');”并显示
SIMPLIFIED CHINESE_CHINA.AL32UTF8(我认为它是服务器端字符集)
所以我看一下Windows xp注册表:HKEY_LOCAL_MACHINE-> SOFTWARE-> Oracle-> NLS_LANG。 它显示:
SIMPLIFIED CHINESE_CHINA.ZHS16GBK(我认为是客户端字符集)
我把它改成了
SIMPLIFIED CHINESE_CHINA.AL32UTF8
但是中国人仍然是乱码。
而且,这个“NAME”字段实际上应该显示:“北京市”。
我执行命令:
select dump(name,1016) from MN_C11_SM_S31 where objectid=1;
并显示:
这是否意味着数据本身存储不正确? 我该怎么办?
补充:只是,我用C#代码用UTF-8解析这个字符串:“e58c97e4baace5b882”。
它显示:“北京市”。我认为这证明数据本身并没有错。
答案 0 :(得分:1)
你需要小心。
SQLplus和OracleSqlDeveloper可能实际上错误地显示中文字符
你需要为中文字符串取一个nvarchar(utf8)字段。
尝试使用C#Windows应用程序输入,插入和显示数据,它在内部使用unicode,因此您至少可以排除该bug源。不要使用控制台应用程序进行显示,控制台应用程序无法正确显示Unicode字符。
然后,您需要将字符串存储在nvarchar字段(而不是varchar)中,并在插入字符串时使用nvarchar类型的参数。
INSERT INTO YOUR_TABLE (newname)
VALUES (:UnicodeString)
command.Parameters.Add (":UnicodeString", OracleType.NVarChar).Value = stringToSave;