gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:47:50 24 4
gpt4 key购买 nike

我在将中文字符写入 Oracle 数据库时遇到了问题。这里有一些信息供您引用。

  1. 环境:Oracle 8

    select userenv('language') form dual;

    返回

    American.America.UTF8
  2. 开发:

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

    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...

之后,存储在 DBMS 中的值不正确,无论是值还是转储结果。

最佳答案

Decimal Hexadecimal Binary
197 c5 1100 0101
243 f3 1111 0011
211 d3 1101 0011
209 d1 1101 0001

查看Wikipedia我们看到 197 是双字节序列的第一个字节,243 是四字节序列的第一个字节,211 是双字节序列的第一个字节,208 是双字节序列的第一个字节。那不是有效的 UTF-8。你能告诉我们 friend 这两个字符的 unicode 代码点是什么吗?

编辑 啊,GB2313,c5f3 是 Unicode 代码点 u+670b。 d3d1 是 u+53cb。 (在 http://demo.icu-project.org/icu-bin/convexp?conv=ibm-1383_P110-1999&ShowLocales&s=ALL#ShowLocales 处使用转换器找到)

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

请注意,Oracle 的“utf8”字符集不是完整的现代 UTF-8,而是 CESU-8。在这种情况下不是问题,因为这些字符位于基本多语言平面上,并且在 UTF-8 和 CESU-8 中具有相同的编码。我能找到的最早引用资料是针对 Oracle 8i 的:http://download.oracle.com/docs/cd/A87860_01/doc/server.817/a76966/appa.htm#971460 .

关于c# - 使用正确的字符集将字符写入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com