C# 如何使用odbc源向使用c的Oracle数据库获取特殊字符?

C# 如何使用odbc源向使用c的Oracle数据库获取特殊字符?,c#,oracle,odbc,unicode-string,C#,Oracle,Odbc,Unicode String,我有一个Oracle数据库的ODBC数据源。 表I选择的数据有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_字符集,返回AL32UTF8;对于NLS_

我有一个Oracle数据库的ODBC数据源。 表I选择的数据有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_字符集,返回AL32UTF8;对于NLS_NCHAR_字符集,返回AL16UTF16

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

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

谢谢,Cew3

编辑: 将系统环境NLS_LANG设置为GERMAN_GERMAN.AL32UTF8并重新启动机器!解决了这个问题


谢谢大家的提示/评论

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

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

使用Oracle的ODBC驱动程序,例如,此驱动程序应该可以工作。

解决方案是:

将系统环境NLS_LANG设置为GERMAN_GERMAN.AL32UTF8并重新启动机器


您使用哪个ODBC驱动程序?这可能是客户端计算机上的本地NLS_LANG环境变量-V$NLS_PARAMETERS视图显示数据库的字符集,该字符集可能与客户端的不同@kfinity,事实上,它可以完全不同!。如果你想让它们相等,你会设置什么?AL32UTF8还是AL16UTF16?假设您在一条select语句中选择了一个VARCHAR2和一个NVARCHAR2数据类型列。看到漂亮的帖子!我的意思是OP的NLS_LANG可能设置不正确-我没有做太多的C编码,但是如果它默认使用UTF-16,并且NLS_LANG=.WE8ISO8859P1,这不会导致这种数据损坏吗?你确定ODBC驱动程序吗?请发布您的连接字符串。同时发布准确的NLS_LANG值。你从垃圾堆里得到了什么,1016?