我有一个旧的MySQL数据库,编码设置为UTF-8。我正在使用Ado.Net Entity框架连接到它。
当ë喜欢字符时,我从中检索的字符串有奇怪的字符。
例如:“ë”是“Ô“。
我认为我可以通过从UTF8转换为UTF16来实现这一目标。
return Encoding.Unicode.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.Unicode,
Encoding.UTF8.GetBytes(utf8)));
}
然而,这并没有改变一件事。
我怎样才能以正确的形式从这个数据库中获取数据?
答案 0 :(得分:35)
在ADO.NET实体框架工作中(或通常使用MySQL .NET连接器),您需要做两件事来支持UTF-8:
utf8_general_ci
或其关系之一)将Charset=utf8;
添加到您的连接字符串中。
"Server=localhost;Database=test;Uid=test;Pwd=test;Charset=utf8;"
我不确定,但编码可能区分大小写; 我发现CharSet=UTF8;
对我不起作用。
答案 1 :(得分:3)
即使数据库设置为UTF8,您也必须执行以下操作才能使Unicode字段正常工作:
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前缀,则无法获得正确的数据,因为它将被转发为Latin 1 / ASCII字符集
答案 2 :(得分:1)
尝试通过“set names utf8”查询设置编码。您也可以在mysql config中设置此参数。
答案 3 :(得分:1)
正如其他人所说,这可能是数据库问题,但也可能是因为使用了旧版本的.net mysql连接器。
我真正想要评论的是utf8到utf16的转换。您尝试转换的字符串实际上是alicay unicode编码,因此您的“Ô字符实际上占用4个字节(或更多),并且在转换时不再是“ë”字符的错误表示。这就是你的转换没有做任何事情的原因。 如果你想进行这样的转换,我认为你必须将你的utf8字符串编码为每个字符串1字节的旧样式,使用代码页,其中字节值Ã和«实际上代表ë的utf8字节序列然后将此新字符串的字节视为utf8字符串。有趣的东西。
答案 4 :(得分: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);