java.sql.SQLException: Data truncation: Incorrect string value: '\xE5\x91\xA8\xE6\x9D\xBE' for column 'cname' at row 1 Query
在将项目上传到服务器时,发生这样的错误,总结了一下。
环境Centos7+tomcat7+Mariadb数据库
首先mysql -uroot -p 输入密码
然后查询数据库当前码表状态
show variables like '%char%';
结果如下
可以看出Character_set_database=latinl和Character_set_results=latinl这个两个非utf8格式
一般来说,如果为了防止数据库乱码,或者无法插入,适合采用全utf8格式 但是有可能存在存储空间损耗的问题
那么修改这两个非utf8的参数
修改mariadb数据库的参数
1.打开server.cnf文件
vi /etc/my.cnf.d/server.cnf
2.在server.cnf文件的【mysqld】标签中添加如下内容
init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
3.打开 mysql-clients.cnf文件
vim /etc/my.cnf.d/ mysql-clients.cnf
4.在[mysql]标签下添加
default-character-set=utf8
最后看数据库连接配置
重启mariadb数据库
systemctl restart mariadb
查看数据库连接情况
如果这样依旧不能解决乱码问题 那么就设置,那么就可能是连接的问题
查看连接的字符码格式
show variables like "collation_%";
设置为UTF8
SET NAMES 'utf8';
然后如果是数据库设置编码的问题或者表设置编码的问题
这里可以看到有一个test数据库
设置test数据库的编码格式
ALTER database test character set utf8;
然后可以看到一个test表,设置表的编码格式
ALTER table test character set utf8;
最后查看表的编码格式
可以看到尽管外部是utf8设置的表的字符码,但是内部行的数据仍然为latin1的格式
所以这个时候修改行的字符为
alter table test change `cname` `cname` varchar(20) character set utf8;
最后插入一条中文数据尝试
数据库能够正常使用,而且在服务器上做测试和window上的实验结果相同
最后总结数据库存储过程中如果出现乱码或其他异常问题问题
1.数据库设置不正确产生的乱码或者错误
2.存储过程中的乱码 数据库或者表或者行的字符码不正确
3.操作数据库的url不正确或者sql语句存在问题等