今天在进行mysql操作的时候,遇到了下面的错误:
java.sql.SQLException: Incorrect stringvalue: '\xE5\xBC\xA0\xE4\xB8\x89...' for column 'Ub_name' at row 1
有句话叫, 百度一下,你就知道,于是我去百度,晓得了是乱码问题。当我按照上面搜索出来的,发现都是七七八八的,再结合自己用大脚拇指想了想,整理如下:
1、 mysql服务器字符集问题
2、 数据传输字符问题
3、 客户端编码问题
我这边有2个mysql,一个是本地的,一个是远程的。本地版本是5.5.28,远程版本是5.1.73
于是,我先更改了properties,如下:
connection.mysql.url=jdbc:mysql://localhost:3306/bberdb?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
然后再运行程序,发现本地数据库保存进去的依然是乱码,于是去mysql看创建表的语句,发现在创建表的时候指定的字符集,于是,删除该表。并重写create table语句,指定其字符集是utf8。
本以为这下可以了,但是发现错误依旧。看到要动用终极钛晶枪了。本地的mysql是windows版本的,于是找到my.ini。更改了2个地方:
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
再运行程序,发现可以保持中文了:
然后将properties里面的切换connection.mysql.url到远程服务器,发现还是报这个错,于是我先手动写了一个insert,发现保存进去是乱码,有了前面的经验,先改的就是my.cnf(远程服务器是liunx)。在[mysqld]下面增加了:
Character-set-server=utf8
运行程序,还是报错,跑到my.cnf里面看,没有[client],于是增加了下面的代码:
[client]
Default-character-set=utf8
发现还是报错,这就让我不乐意了,于是继续百度,看到一个帖子说要增加init_connect=’SET NAMES utf8’,于是我也增加了。运行程序还是报错,于是我就暴怒了,查看了表的建表语句,发现建表语句指定了其他字符集,如下:
CREATE TABLE `buyerUser` (
`U_buyer` int(11) NOT NULL AUTO_INCREMENT,
`Ub_poptype` int(11) DEFAULT NULL,
`Ub_popularrize` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`Ub_ctime` datetime DEFAULT NULL,
`Ub_name` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
`Ub_phone` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`Ub_password` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`Ub_headm` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`Ub_headbig` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
`Ub_sex` tinyint(1) NOT NULL,
`Fb_sex` tinyint(1) NOT NULL,
`Ub_money` double(15,3) DEFAULT NULL,
`Ub_state` tinyint(4) DEFAULT NULL,
`Ub_kade` tinyint(1) DEFAULT NULL,
`Ub_key` int(11) DEFAULT NULL,
`Ub_updatetime` datetime DEFAULT NULL,
PRIMARY KEY (`U_buyer`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULTCHARSET=utf8 PACK_KEYS=0 CHECKSUM=1;
害人呐,更改了Ub_name后面的CHARACTER SET为utf8,然后再运行程序就可以存储汉字了。
Lunix最后的配置文件如下:
如果是用的eclipse的项目,使用tomcat的话,还要注意一下就是tomcat的servet.xml要看下指定的编码集合:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
可以在这里里面增加下面的编码: URIEncoding="UTF-8"
【总结】
有时候通过Navicat操作不靠谱,还是要sql语句操作好点