我有一个通过System.Data.OracleClient连接到oracle数据库的.net应用程序(Winforms应用程序)。 当我查询数据库时,我看到“?”而不是土耳其人物。但是有一个delphi应用程序使用相同的数据库(和相同的数据库用户)它可以显示土耳其字符,如“İ,Ş,Ğ,Ü”等。
我和toad和pl / sql Developer有同样的问题。我认为delphi应用程序可以显示土耳其字符来设置连接字符串中的额外参数。(我设置“encoding = true”但它不起作用)
我运行此查询以显示nls_lang值;
select DECODE(parameter, 'NLS_CHARACTERSET', 'CHARACTER SET',
'NLS_LANGUAGE', 'LANGUAGE',
'NLS_TERRITORY', 'TERRITORY') name,
value from v$nls_parameters
WHERE parameter IN ( 'NLS_CHARACTERSET', 'NLS_LANGUAGE', 'NLS_TERRITORY')
这显示了我的那些价值观;
1 LANGUAGE AMERICAN
2 TERRITORY AMERICA
3 CHARACTER SET AL32UTF8
最后,当我更新“?”对于pl / sql开发人员的土耳其语字符(例如“Ş”),我的.net应用程序正确显示。但我无法取代所有“?”土耳其人的价值观。
答案 0 :(得分:0)
我认为你已经解决了这个问题。我想知道你是否得到任何关于缺少NLS_LANG环境变量设置的提示,尤其是在启动PL / SQL Developer时。 NLS_LANG只是告诉OCI接口期望哪个字符集。当数据在DB-Server和客户端之间传输时,就会发生转换。
独立于此。如果您不确定使用 table 中的select DUMP( stingcol ),该语句将返回存储的实际值以及字符集。
PL / SQL Developer或SQL / Detective使用DOA组件(Allround Automation)。但是Delphi应用程序可以使用不同的数据库组件,这些组件在查询结果到达后提供了指定和处理字符转换的不同方法。
在您的特定情况下,因为.net应用程序和两个工具都没有正确显示字符('?')。您查询的参数是数据库端的NLS参数。
所以你至少有两个选择