最近我在用mybatis插入一条数据到mariadb时,报了一个不正确的字符串的错误,服务器显示500错误,从控制台打印相关的提交数据都比较正常,试了英文没有问题,那么问题就出现在了字符集了。
错误截图
错误信息主要如下:
### Error updating database. Cause: java.sql.SQLDataException: (conn=329) Incorrect string value: '\xE4\xB9\xB0:15...' for column 'note' at row 1
### The error may exist in com/xiao/shopping/demo/dao/PurchaseRecordDao.java (best guess)
### The error may involve com.xiao.shopping.demo.dao.PurchaseRecordDao.insertPurchaseRecord-Inline
### The error occurred while setting parameters
### SQL: insert into T_PURCHASE_RECORD( id,user_id,product_id,price,quantity,sum,purchase_date ,note ) values ( ?,?,?,?,?,?,now(),? )
### Cause: java.sql.SQLDataException: (conn=329) Incorrect string value: '\xE4\xB9\xB0:15...' for column 'note' at row 1
; (conn=329) Incorrect string value: '\xE4\xB9\xB0:15...' for column 'note' at row 1; nested exception is java.sql.SQLDataException: (conn=329) Incorrect string value: '\xE4\xB9\xB0:15...' for column 'note' at row 1] with root cause
后面上了mariaDB官网看,原来mariadb默认的字符集是latin1,而服务器字符集为utf-8,当使用中文写入数据库时,字符集不正确,便出错了。官网原话如下:
In MariaDB, the default character set is latin1, and the default collation is latin1_swedish_ci
When changing a character set and not specifying a collation, the default collation for the new character set is always used.
我们使用一条命令查看表的字符集
show create table [表格名称]
show create database [数据库名称]
查看数据库后,确实是这样。
数据库表字符集打印结果数据库字符集
我们可以使用下面这条SQL语句更改数据库表和数据库的字符集
修改字符集后重新post数据ALTER TABLE
shopping
.T_PURCHASE_RECORD
MODIFY COLUMNnote
varchar(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL;
ALTER DATABASE shopping COLLATE = 'utf8_unicode_ci', CHARACTER='utf8';
修改后我们字符集的问题就解决了。不过,虽然我们使用的数据库字符集正确了,如果没有修改数据库的设置,我们再创建一张表或者数据库,又回遇到这个坑爹的问题。为了一劳永逸,我们直接修改数据库配置。
my.cnf配置文件linux下运行vim命令操作my.cnf配置文件
sudo vi /etc/my.cnf
添加一行
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
网友评论