MySQL C# 文本编码问题

Posted

技术标签:

【中文标题】MySQL C# 文本编码问题【英文标题】:MySQL C# Text Encoding Problems 【发布时间】:2010-10-30 20:20:21 【问题描述】:

我有一个编码设置为 UTF-8 的旧 mysql 数据库。我正在使用 Ado.Net Entity 框架来连接它。

当预期 ë 类似字符时,我从中检索到的字符串包含奇怪的字符。

例如:“ë”是“ë”。

我认为我可以通过将 UTF8 转换为 UTF16 来解决这个问题。

 return Encoding.Unicode.GetString(                
            Encoding.Convert(
            Encoding.UTF8,
            Encoding.Unicode,
            Encoding.UTF8.GetBytes(utf8)));
    

但这并没有改变任何事情。

我怎样才能以正确的形式从这个数据库中获取数据?

【问题讨论】:

问题很可能出在 MySql 存储中。你的桌子是什么样子的? 【参考方案1】:

即使数据库设置为 UTF8,您也必须执行以下操作才能使 Unicode 字段正常工作:

    确保您使用的是 Unicode 字段类型,例如 NVARCHARTEXT CHARSET utf8 每当您在字段中插入任​​何内容时,都必须在其前面加上 N 字符以指示 Unicode 数据,如下例所示 每当您根据 Unicode 数据进行选择时,请确保再次使用 N 前缀

MySqlCommand cmd = new MySqlCommand("INSERT INTO EXAMPLE (someField) VALUES (N'Unicode Data')");

MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM EXAMPLE WHERE someField=N'Unicode Data'");

如果数据库未正确配置或插入数据时未使用 N 前缀,则无法获取正确的数据,因为它已被向下转换为拉丁 1/ASCII 字符集

【讨论】:

恐怕就是这种沮丧的问题。这些表采用 UTF8 格式,但字段只是 VARCHAR。有没有办法将其“向上转换”为 utf8 或任何编码来取回数据? 奇怪的是,使用数据库的 Ruby on Rails 应用程序在正确获取数据方面似乎没有任何问题【参考方案2】:

尝试通过“set names utf8”查询设置编码。您也可以在 mysql config 中设置此参数。

【讨论】:

【参考方案3】:

正如其他人所说,这可能是一个 db 问题,但也可能是由使用旧版本的 .net mysql 连接器引起的。

我真正想评论的是 utf8 到 utf16 的转换。您尝试转换的字符串实际上已经是 unicode 编码的,因此您的“ë”字符实际上占用 4 个字节(或更多),并且在转换时不再是“ë”字符的错误表示。这就是为什么你的转换没有做任何事情的原因。 如果您想进行这样的转换,我认为您必须使用代码页将 utf8 字符串编码为每个字符串 1 个字节的旧样式,其中 à 和 « 的字节值实际上表示 ë 的 utf8 字节序列,然后将此新字符串的字节视为 utf8 字符串。有趣的东西。

【讨论】:

【参考方案4】:

为了在 ADO.NET 实体框架中支持 UTF-8(或通常使用 MySQL .NET 连接器),您需要做两件事:

    确保您的数据库表的排序规则是 UTF-8 排序规则(即utf8_general_ci 或其关系之一)

    Charset=utf8; 添加到您的连接字符串。

    "Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;"
    

我不确定,但编码可能区分大小写; 我发现CharSet=UTF8; 对我不起作用。

【讨论】:

我已经将此信息添加到连接字符串,但无法使用。 【参考方案5】:

谢谢牛的嘴, 您的解决方案有效,但我们仍然需要转换字符。 我认为这是你的问题:) 对于转换字符,您可以使用此代码

 System.Text.Encoding utf_8 = System.Text.Encoding.UTF8;

 string s = "unicode";

 //string to utf
 byte[] utf = System.Text.Encoding.UTF8.GetBytes(s);

 //utf to string
 string s2= System.Text.Encoding.UTF8.GetString(utf);

【讨论】:

以上是关于MySQL C# 文本编码问题的主要内容,如果未能解决你的问题,请参考以下文章

C# Mysql UTF8 编码

在不同的返回类型上将字符串从 C# 传递到 C++ DLL 不同的文本编码

如何确定文本的编码?

C# base64编码的文本与图片互转

将 utf-8 编码的文本加载到 MySQL 表中

C# 如何将byte[]用正确字符编码转为字符串?