C# 使用正确的字符集将字符写入数据库

C# 使用正确的字符集将字符写入数据库,c#,oracle,C#,Oracle,我在将汉字写入Oracle数据库时遇到了一个问题。这里有一些信息供你参考 环境:Oracle 8 select userenv('language') form dual; 返回 American.America.UTF8 发展: .NET2/C# 客户端字符集: gb2312 我只是手动测试将值写入表中,结果是正确的,应该如下所示: VALUE: 朋友 //chinese word means 'friend' DUMP: 197,243,211,209 //cacula

我在将汉字写入Oracle数据库时遇到了一个问题。这里有一些信息供你参考

环境:Oracle 8

select userenv('language') form dual;
返回

American.America.UTF8
发展:

.NET2/C#
客户端字符集:

gb2312
我只是手动测试将值写入表中,结果是正确的,应该如下所示:

VALUE: 朋友        //chinese word means 'friend'
DUMP: 197,243,211,209 //caculated by Oracle dump() function
Encoding def = Encoding.Default;
Encoding utf8 = Encoding.UTF8;
byte[] bytes = def.GetBytes("朋友");
//For debug
//string debug = "";
//foreach(byte b in bytes)
//   debug += b.ToString() + " ";
//Debug.WriteLine(debug); //That will display 197,243,211,209 as the same as the Dump value mentioned
string value = utf8.GetString(bytes);
//I also try, string value = utf8.GetString(Encoding.Convert(def,utf8,bytes))
string sql = String.Format("UPDATE T SET C='{0}' WHERE...",value);
//execute the sql...
使用代码编写,代码捕捉如下所示:

VALUE: 朋友        //chinese word means 'friend'
DUMP: 197,243,211,209 //caculated by Oracle dump() function
Encoding def = Encoding.Default;
Encoding utf8 = Encoding.UTF8;
byte[] bytes = def.GetBytes("朋友");
//For debug
//string debug = "";
//foreach(byte b in bytes)
//   debug += b.ToString() + " ";
//Debug.WriteLine(debug); //That will display 197,243,211,209 as the same as the Dump value mentioned
string value = utf8.GetString(bytes);
//I also try, string value = utf8.GetString(Encoding.Convert(def,utf8,bytes))
string sql = String.Format("UPDATE T SET C='{0}' WHERE...",value);
//execute the sql...
之后,存储在DBMS中的值以及它的转储结果都不正确

Decimal Hexadecimal Binary
197     c5          1100 0101
243     f3          1111 0011
211     d3          1101 0011
209     d1          1101 0001
我们看到197是两字节序列的第一个字节,243是四字节序列的第一个字节,211是两字节序列的第一个字节,208是两字节序列的第一个字节。这是无效的UTF-8。你能告诉我们这两个字符的unicode编码是什么吗朋友 是吗

编辑Ah,GB2313,c5f3是Unicode代码点u+670b。d3d1为u+53cb。在使用转换器时发现

仔细检查Oracle客户端正在使用的客户端字符集。我在Oracle 10gR2上看到的是,如果Oracle的客户机与数据库服务器具有相同的字符编码,那么字符将不会被翻译,因为它们是相同的字符集,但不会被验证。在手动插入时,它们似乎是相同的,并且为您想要的字符插入了GB2313值,这在数据库中无效,因为它是utf8


注意,Oracle的utf8字符集不是完整的现代UTF-8,而是CESU-8。在这种情况下不是问题,因为这些字符位于基本的多语言平面上,并且在UTF-8和CESU-8中具有相同的编码。我能找到的最早参考资料是Oracle 8i:

什么是数据库字符集?从v$nls_参数中选择*参数,其中的参数类似于“%CHARACTERSET”您好,Justin。NLS_CHARECTERSET&NLS_NCHAR_CHARECTSET是UTF8。我不熟悉Oracle,但在Sql Server中,如果需要unicode,则需要N前缀。也许值得一试?谢谢史努比。但它不起作用。只需返回“ora-12704字符集不匹配”。或者有人知道我是否可以将原始二进制数据写入vachar2类型列中吗?嗨,香农,非常感谢你的精彩回答。在您的帮助下,我使用以下代码进行测试。你能告诉我如何用C完成我想要的功能吗?ruby代码str=朋友 str.each|U codepoint do|cp|print'U+%4X'%cp',end put str.each|U byte{b|print b',}//结果:U+670B U+53CB 230 156 139 229 143 139No。我知道的C不够多,无法在这方面提供帮助。另外,使用您现在拥有的存储哪些值?它们可能是相关代码点的有效UTF-8。