MySQL C# 文本编码问题

问题描述 投票:0回答:7

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

当需要类似 ë 的字符时,我从中检索的字符串有奇怪的字符。

例如:“ë”是“à”。

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

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

但这并不能改变什么。

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

c# mysql unicode utf-8
7个回答
38
投票

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

  1. 确保数据库表的排序规则是 UTF-8 排序规则(即
    utf8_general_ci
    或其关系之一)
  2. Charset=utf8;
    添加到您的连接字符串中。

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

我不确定,但编码可能区分大小写; 我发现

CharSet=UTF8;
对我不起作用。


3
投票

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

  1. 确保您使用的是 Unicode 字段类型,例如 NVARCHARTEXT CHARSET utf8
  2. 每当您在字段中插入任何内容时,都必须在其前面添加 N 字符作为前缀以指示 Unicode 数据,如下面的示例所示
  3. 每当您基于 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 字符集


1
投票

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


1
投票

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

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


0
投票

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

 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);

0
投票
"Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;"

它有效 - PowerShell 7.2、MySQL 连接器 8.0.29


0
投票

只需删除这个包:

Mysql.Data

并安装以下软件包:

MySql.EntityFrameworkCore
© www.soinside.com 2019 - 2024. All rights reserved.