【发布时间】: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