数据中mysql报错1366_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也不熟,鼓捣了一阵才解决。这个问题还是比较常见的,根据我自身的情况,关键的地方或者说引发异常的条件是这几个:

UTF-8编码的特殊字符

MySql采用的是GBK编码,特别要留意数据库/表/字段这三个不同级别的字符集编码

在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上查看,最后执行结果如下图。

c6e6b08eb5daa61034b7eb6afca1ff09.png

上面代码中的正则是我在网上找到的,对于我遇到的问题来说是足够用了,已经包含了很多UTF8的特殊字符。如果有遗漏,还可以用土一点的办法,用Replace替换掉特殊符号。

解决方法二:从数据库入手,统一编码设置

主要就是将MySql的库/表/字段编码都设置成utf8,这样就能包容要添加的特殊字符了。

这个方法局限性比较大,毕竟有时候数据库是没办法随意更改的。另外在MySql中,除了utf8外,还有utf8mb4这种格式的编码,网上有篇遇到emoji表情存入数据库引发Incorrect string value异常的文章,主要就是这两种编码引发的问题,可以参考下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值