mysql 1366错误:字符集冲突导致插入数据异常,解决方案

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

一:异常信息:errorCode:1366 Caused by: java.sql.SQLException: Incorrect string value: ‘xE7xAE…’ for column ‘description’ at row 1
二:异常原因:字符集冲突 mysql insert入库的时候,由于插入数据编码与数据库字段字符集不一致,导致数据无法插入。
三:追本溯源 在mysql数据库中执行show character set,可以看到不同的字符集的最大长度不同。 如果执插入utf8编码数据,数据库表中字段字符集是latin。(查询字段字符集方法:show full columns from user;) 如果最大长度为3的utf8字符集存储到最大长度为1的latin数据库字段中,数据会被截断,无法正常插入,导致异常。
四:解决办法 修改数据库的字符集编码 MySQL配置文件在Windows下叫my.ini,在MySQL的安装根目录下;在Linux下叫my.cnf,,该文件位于/etc/my.cnf。
(1)window服务器 mysql数据库的配置文件my.ini,此文件放在mysql根目录下。在此文件下查找default-character-set属性,并将其值更改为utf8:default-character-set = utf8
(2)linux服务器 修改my.cnf vi /etc/my.cnf 在[client]下添加 default-character-set=utf8 在[mysqld]下添加 default-character-set=utf8 在新的版本5.5以上,如果这样修改的话,会造成无法启动的错误, 报的是pid文件更新问题。 经过查看mysql日志,如下: 是default-character-set参数不可用。 新版本mysql配置方法是 在[mysqld]下把default-character-set=utf8换成character-set-server=utf8就可以了 重启mysql可以使用 sudo /etc/init.d/mysql restart 注意修改数据库编码以后,需要把以前的数据库删除掉,重新建立。
五:补充知识 (1)字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等; 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码; 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{‘A’,’B’}时,{‘A’=>0, ‘B’=>1}就是一个字符集; (2)字符序(Collation)是指在同一字符集内字符之间的比较规则; 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系; 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation); MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以ci(表示大小写不敏感)、cs(表示大小写敏感)或bin(表示按编码值比较)结尾。例如:在字符序utf8_general_ci''下,字符a”和“A”是等价的; (3)MySQL字符集设置 系统变量: – charactersetserver:默认的内部操作字符集 – charactersetclient:客户端来源数据使用的字符集 – charactersetconnection:连接层字符集 – charactersetresults:查询结果字符集 – charactersetdatabase:当前选中数据库的默认字符集 – characterset_system:系统元数据(字段名等)字符集

赞(7)