【问题标题】:How to get special characters using an odbc source to an Oracle database using c#?如何使用 odbc 源将特殊字符获取到使用 c# 的 Oracle 数据库?
【发布时间】:2019-05-15 18:59:28
【问题描述】:

我有一个指向 Oracle 数据库的 ODBC 数据源。 我从中选择数据的表有 varchar2 列,其中包含例如“kg/m³”或“°C”。

现在在我的 c# 应用程序中使用 ODBCConnection,OdbcDataReader 返回“kg/m? 和“?C”。

检查 NLS 参数:

SELECT * 
FROM V$NLS_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

为NLS_CHARACTERSET 返回AL32UTF8,为NLS_NCHAR_CHARACTERSET 返回AL16UTF16。

如果我将列类型更改为NVARCHAR,OdbcDataReader 将返回正确的值。 但更改表列不是一种选择,因为该数据库也被其他应用程序使用。

有没有办法通过在连接、命令或读取器对象上设置任何参数来获得正确的值?

谢谢,Cew3

编辑: 设置系统环境NLS_LANG为GERMAN_GERMANY.AL32UTF8(重启机器!)解决了问题!

谢谢大家的提示/cmets!

【问题讨论】:

  • 您使用哪个 ODBC 驱动程序?
  • 这可能是您客户端机器上的本地 NLS_LANG 环境变量 - V$NLS_PARAMETERS 视图显示数据库的字符集,它可能与您的客户端不同。 stackoverflow.com/questions/4955363/…
  • @kfinity,确实可以不同(没有任何问题!)。如果你想让它们相等 - 你会设置什么? AL32UTF8 还是 AL16UTF16?假设您在一个 SELECT 语句中选择了 VARCHAR2 和 NVARCHAR2 数据类型列。见stackoverflow.com/questions/33783902/…
  • 好帖子!我只是说 OP 的 NLS_LANG 可能设置不正确——我没有做太多 C# 编码,但如果它默认使用 UTF-16 和NLS_LANG=.WE8ISO8859P1,那不会导致这种数据损坏吗?
  • 您确定 ODBC 驱动程序吗?请发布您的 ConnectionString。还要发布确切的NLS_LANG 值。你从DUMP(<column_name>, 1016) 得到什么?

标签: c# oracle odbc unicode-string


【解决方案1】:

解决方案是:

设置系统环境NLS_LANG为GERMAN_GERMANY.AL32UTF8并重启​​机器!

【讨论】:

    【解决方案2】:

    您很可能正在使用来自 Microsoft 的古老和 deprecated Microsoft ODBC for Oracle 驱动程序。它不支持 UTF-8。

    Oracle 的 ODBC 驱动程序不支持任何新的 Oracle8 数据类型 - Unicode 数据类型、BLOB、CLOB 等等 - 也不是 支持 Oracle 新的关系对象模型。

    使用 Oracle 的 ODBC 驱动程序(例如ODAC Runtime Downloads),这个应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2013-11-14
      • 2015-03-04
      • 2017-08-17
      • 2013-03-31
      • 1970-01-01
      • 2019-02-13
      相关资源
      最近更新 更多