在开发某个.NET项目的过程中,遇到了UTF-8编码的特殊字符在插入到GBK编码的MySql数据库时,引发了这样的错误:ERROR 1366: Incorrect string value: '\xE2\x80\xA2\xE7\x8A\xB6...' for column 'title' at row 2。
由于我对MySql也不熟,鼓捣了一阵才解决。这个问题还是比较常见的,根据我自身的情况,关键的地方或者说引发异常的条件是这几个:
问题最根本的原因在于某些UTF-8编码的特殊字符对于GBK来说是无法识别的,如果在C#中强行转换会变成“?”问号之类的奇怪符号,所以这部分数据在添加到MySql的时候引发了Incorrect string value。
这种方法不用对数据库做任何操作,可以保留数据库原本的GBK编码格式,只要在问题数据要添加或修改进数据库之前进行操作,通过正则表达式将所有GBK不支持的UTF8符号替换掉!
另外还有一个思路就是强行转换编码,不过就如上面所说,强行转换这部分字符会变成问号或其他一些奇怪的符号。我当时试了下没有成功,数据插入到MySql依然报错,所以还是采用删除的方法。
具体代码如下,代码在控制台程序中运行(案例代码中就有两个特殊符号):
string content = "测•试�字符";
Console.WriteLine(content);
var regex = new Regex(@"[^\u4E00-\u9FA5\u3000-\u303F\uFF00-\uFFEF\u0000-\u007F\u201c-\u201d]", RegexOptions.Multiline | RegexOptions.ExplicitCapture);
content = regex.Replace(content, "");
//content=content.Replace("�", "").Replace("•", "");
Console.WriteLine(content);
Console.ReadKey();
备注:代码也可以从github上查看,最后执行结果如下图。
上面代码中的正则是我在网上找到的,对于我遇到的问题来说是足够用了,已经包含了很多UTF8的特殊字符。如果有遗漏,还可以用土一点的办法,用Replace替换掉特殊符号。
主要就是将MySql的库/表/字段编码都设置成utf8,这样就能包容要添加的特殊字符了。
这个方法局限性比较大,毕竟有时候数据库是没办法随意更改的。另外在MySql中,除了utf8外,还有utf8mb4这种格式的编码,网上有篇遇到emoji表情存入数据库引发Incorrect string value异常的文章,主要就是这两种编码引发的问题,可以参考下。
版权声明:本文由十有三创作,采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请务必署名-保留作者名称及出处:https://shiyousan.com/post/636340896985738820。