C#中特殊字符存入MySql报错“ERROR 1366: Incorrect string value“

在开发某个.NET项目的过程中,遇到了UTF-8编码的特殊字符在插入到GBK编码的MySql数据库时,引发了这样的错误:ERROR 1366: Incorrect string value: '/xE2/x80/xA2/xE7/x8A/xB6…' for column 'title' at row 2

由于我对MySql也不熟,鼓捣了一阵才解决。这个问题还是比较常见的,根据我自身的情况,关键的地方或者说引发异常的条件是这几个:

  1. UTF-8编码的特殊字符
  2. MySql采用的是GBK编码,特别要留意数据库/表/字段这三个不同级别的字符集编码
  3. 在1和2条件满足的情况下,将数据insert或update到数据库中。

问题最根本的原因在于某些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异常的文章,主要就是这两种编码引发的问题,可以参考下。




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/99039.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论