【问题标题】:Oracle Turkish Character could not be displayed无法显示 Oracle 土耳其语字符
【发布时间】:2016-04-18 08:53:21
【问题描述】:

我有一个通过 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 应用程序显示正确。但我不能替换所有“?”土耳其字符的值。

【问题讨论】:

    标签: c# oracle


    【解决方案1】:

    我想你已经解决了这个问题。我想知道您是否对丢失的 NLS_LANG 环境变量设置有任何提示,尤其是在启动 PL/SQL Developer 时。 NLS_LANG 只是告诉 OCI 接口需要哪个字符集。转换发生在 DB-Server 和客户端之间传输数据时。

    独立于此。如果您不确定使用 select DUMP(stingcol) from table 并且该语句将返回存储的实际值以及字符集。

    PL/SQL Developer 或 SQL/Detective 使用 DOA 组件(全能自动化)。但是 Delphi 应用程序可以利用不同的 DB 组件,这些组件提供不同的方式来指定和处理查询结果到达后的字符转换。

    在您的特定情况下,.net 应用程序和这两个工具都没有正确显示字符('?')。你查询的参数是DB端的NLS参数。

    所以你至少有两个选择

    1. 控件不支持 UNICODE
    2. NLS_LANG 未设置 - 客户端假定为 US7ASCII 或 WE8ISO8859P1

    如果您的工具还没有过时,它们都可以识别 UNICODE。今天一般来说,FireDAC Explorer 会为您提供一份报告,显示连接使用的相关设置。例如

    ...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2020-10-02
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多