背景:
最近在做一个项目,然后大家做了很久,十分平静。突然今天同事输入了一个汉字,进行保存,结果Console中打印出如下错误:
Exception in thread "main" java.sql.SQLException: Incorrect string value: '\xE4\xB8\xAD\xE5\x9B\xBD...' for column 'aaa' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3376)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3308)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1837)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1961)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2537)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2466)
at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:735)
这段异常,似曾相识,却一时认不出它来。不过第一个感觉上就是编码错误。即应用程序编码与数据库编码不一致。确定这个问题,之前我遇到过,也解决了。但一时又没有想到怎么解决。
解决思路:
问题缘由是数据库中的对应字段的编码格式与应用传递的数据编码格式不一致导致。
所以,我们需要将对应字段的编码格式首先调整为一致的。这样保持了应用与数据库之间访问正常。
注意
在解决此次问题中,陷入的误区:
数据库有字符编码,表有字符编码,字段有数据编码。
库映射到数据表,数据表映射到字段。主要是作为一个默认,而对于每个字段上的编码是实际作用的。
【扩展】
对于由这个问题,我查询的一些东西整理出来,以处理日后关于linux下数据库的设置。
1. 刚安装好的mysql,字符配置如下:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
我们需要配置my.cnf下,以确定mysql在启动时,编码为utf-8
注意:mysqld下的是character-set-server,mysql下的是default-character-set,写错了会导致mysql无法启动。
[mysqld]
character-set-server=utf8
[mysql]
no-auto-rehash
default-character-set=utf8
重启后,mysql的字符集变为如下,
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
至此,调整了数据库的默认编码格式为utf-8