解决 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)

OperationalError: (1267, "Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'")

今天在系统里做了一个中文的检索,结果 就出现如上的错误提示,第一反应是数据库字符集的问题,那么就按照下面的步骤,一步一步来排查:

1.查看数据库的字符集是否有问题

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+--------------------------------------------------+
| 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       | /bin/mysql-5.7.22/share/charsets/                |
+--------------------------+--------------------------------------------------+

仔细看了,上面的字符集确实没有问题。

2.查看数据库的排序规则

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_bin        |
| collation_server     | utf8_bin        |
+----------------------+-----------------+

同样是没有发现问题

3.排查表的字符集

CREATE TABLE `bus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL DEFAULT '',
  `pid` int(11) NOT NULL,
  `stat` int(11) NOT NULL,
  `dept_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 |

同样未见异常,那么问题就来了,根据报错信息,一定是字符集的问题导致的,所以通过打开DEBUG开关,触发报错,得到报错对应的sql语句,并将sql语句拿到数据库的client 端直接运行,得到的结果却是如标题所示,那么问题就明朗了,就是这条sql,再具体分析sql的语义后,发现本条sql不仅仅只查了bus 表,还有另一张表,查看结果如下:

 CREATE TABLE `data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `instance_id` int(11) NOT NULL,
  `name` varchar(16) NOT NULL,
  `business_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `un_idx_instance_id_name` (`instance_id`,`name`),
  KEY `indx_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=401 DEFAULT CHARSET=latin1

看到 CHARSET=latin1 了,问题找到,那么开始改此表的字符集,以及对历史数据(有中文)的修改

alter table `data` charset=utf8;
alter table `data` convert to character set utf8;

搞定了。解决问题还是要找到根源。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值