背景: java
最近在作一个项目,而后你们作了好久,十分平静。忽然今天同事输入了一个汉字,进行保存,结果Console中打印出以下错误: mysql
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
解决思路: sql
问题原因是数据库中的对应字段的编码格式与应用传递的数据编码格式不一致致使。
因此,咱们须要将对应字段的编码格式首先调整为一致的。这样保持了应用与数据库之间访问正常。 数据库
注意 编码
在解决这次问题中,陷入的误区: spa
数据库有字符编码,表有字符编码,字段有数据编码。
库映射到数据表,数据表映射到字段。主要是做为一个默认,而对于每一个字段上的编码是实际做用的。 code
【扩展】 server
对于由这个问题,我查询的一些东西整理出来,以处理往后关于linux下数据库的设置。 utf-8
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