MySQL数据库插入中文出现“Incrrect Strng value '\xE9\x9C\x82'"错误

来源:互联网 发布:ubuntu 安装 交换分区 编辑:程序博客网 时间:2024/05/01 01:42

最近在做一个系统,关于商品买卖的,在商品买卖前要先发布商品,商品的添加是通过一个后台系统添加的。后台系统采用的是Spring+Flex;数据库的操作都是用的Spring自带的jdbcTemplate框架。商品发布一直没有问题,也可以插入中文。但是,一次同事从淘宝上考下来一段文字( 霂末 夏季嘻哈潮网帽 韩版高挺透气卡车货车帽棒球帽女男士遮阳帽子可调节MZ1053 眼镜 黑色 )后,后台报了如下错误:

Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x90</...' for column ……

一开始出了问题后,就像没头苍蝇似的到网上找各种资料,各种解决办法但是遇到的都是各种错误。无助啊!


后来,静了静心。做了以下测试:
1.首先通过MySQL客户端将上面的那条数据通过insert语句插入到数据库,但是还是出现了这个错误:
ERROR 1366: 1366: Incorrect string value: '\xE9\x9C\x82\xE6\x9C\xAB...' for column 'productName' at row 1
SQL Statement:
INSERT INTO `community_dbo`.`product` (`productName`) VALUES ('霂末 夏季嘻哈潮网帽 韩版高挺透气卡车货车帽棒球帽女男士遮阳帽子可调节MZ1053 眼镜 黑色')
通过这个测试说明不是Java程新的错误。

2.新建一个MySQL数据库表,表的编码方式与原来的商品表的不同(商品表的是gb2312_gb2312_chinese_ci,改过之后用的是utf8_default_collation)
再次插入,没有问题,也不报错了,由此找到问题的原因是数据库表的编码方式。

但是,有一个疑问:其他的中文插入是没有问题的,只有个别特殊的,造成上面的错误的是(霂末 夏季嘻哈潮网帽 韩版高挺透气卡车货车帽棒球帽女男士遮阳帽子可调节MZ1053 眼镜 黑色)中的第一个中文,网上有看到说是"mysql中规定utf8字符MaxLen=3,但是某些unicode字符转成utf8编码之后有4个字节,";

貌似是有道理的。但是还是不是太明白。


因为第二天上班的时候又有一个表出了同样的问题,很是苦恼,所以决定,好好调查一下。
在插入中文的时候,有时会出现编码错误的问题,导致插入数据库出错,问题到底出在哪?为什么把gbk2312编码格式换成了utf-8就可以了。首先想到的就是查一下两者之间的差别,到网上搜到下面一段话,觉得就是问题的所在:

关于GBK、GB2312、UTF8

UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。

GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312

引自http://down.chinaz.com/server/201111/1423_1.htm


0 0
原创粉丝点击