无法显示Oracle Turkish Character

时间:2016-04-18 08:53:22

标签: c# oracle

我有一个通过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应用程序正确显示。但我无法取代所有“?”土耳其人的价值观。

1 个答案:

答案 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参数。

所以你至少有两个选择

  1. 控件不支持UNICODE
  2. 未设置NLS_LANG - 客户端假设US7ASCII或WE8ISO8859P1
  3. 如果你的工具没有死,那么所有工具都可以识别UNICODE。今天,FireDAC Explorer一般为您提供一个报告,显示连接使用的相关设置。例如

    ... FireDAC Connection Info

    当NLS_LANG丢失或“错误”时,您的应用程序可以成功读取和写入自己的数据,但没有其他人可以。