• MySQL 错误:1267 Illegal mix of collations


    https://learnku.com/articles/41546

    、查询 MySQL 的版本:
      SELECT VERSION();
    2、查询 MySQL 当前使用的字符集:   SHOW VARIABLES LIKE '%character%';
    3、查询指定数据库的指定数据表的状态信息(db_test 是数据库,t_text 是数据表):   SHOW TABLE STATUS FROM `db_test` LIKE '%t_text%';
    4、查看数据表的列信息:   SHOW FULL COLUMNS FROM t_text;
    5、修改数据表 t_text 的字符集:   ALTER TABLE t_text DEFAULT CHARACTER SET utf8mb4;

    6、修改数据表 t_text 中的 nickname 字段的字符集:   ALTER TABLE t_text CHANGE nickname nickname VARCHAR(256) CHARACTER SET utf8mb4 NOT NULL;

    事情起因
    今天在一个统计功能时候,因为用到联表查询语句时候 mysql 报错了,错误提示为

    1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
    根据错误提示,推断可能是由于两个表的字符集不一致导致的,接下来我开始了一步步的追踪

    分析过程
    1. 首先,我希望查看一下数据库的字符集,我使用了语句

    show variables like "collation_database";
    显示结果为


    然后,我想看看我查询所用到的表的字符集和数据库的字符集是否一致,我使用语句

    show table status like 'xxxx'


    这样看来表和数据库字符集编码应该是相同的。
    2. 既然表和数据库字符编码一致,那么应该是联合查询的表的字段字符集不一样吧,带着着这样的疑问我继续追踪。
    使用 sql 语句查询一下其中一个表 a 的所有字段

    SHOW FULL COLUMNS FROM a


    在查询另一个表 b 的所有字段

    SHOW FULL COLUMNS FROM b

    如上所示,现在问题找到了,就是字段的字符集编码不一致.

    解决办法
    原因找到后,就开始解决了。我找到了 3 种办法解决
    1. 改变表字段的编码,使两个表的字段编码保持一致。(如果是联合查询一般更改语句 on xx.sn=xxx.sn 中 sn 字段)
    2. 如果没有权限更改表那么可以考虑用 CONVERT 如下

    CONVERT(xxx.sn USING utf8) COLLATE utf8_general_ci=xxxx.sn
    3. 也可以把两个字段转为二进制用

    BINARY xxx.sn=BINARY xxxx.sn
    方法点评
    方法 1 最为直接。(这就要求我们创建数据库和表的时候要注意,保持字符集编码一致真的很重要!!)
    方法 2 对于数据量较大的表不太适用,因为索引有可能没法用到,导致查询速度很慢。
    方法 3 对于字符类型的字段很好用,但是如果字段是数字类型字符串(比如 98765432334 当做字符串来存到表的字段)则有可能得不到想要的结果。

    我按照第 1 中方法改的(本人集运维开发与一身,公司穷,请不起运维),如果有更好的办法,欢迎大家和我交流!

    ————————————————
    原文作者:阿隆索逃跑了
    转自链接:https://learnku.com/articles/41546
    版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

  • 相关阅读:
    应用程序连接hbase报错:java.net.SocketTimeoutException: callTimeout=60000
    《30岁前的每一天》读书笔记(一)
    你在为谁工作——IT帮深圳分站2019年3月线下活动回顾
    定义工作,解读自我——IT帮2019年2月线下活动回顾
    2018年终总结
    svn + nginx unit + python3自动化发布web服务方法
    关于nginx unit服务非正常关闭后,无法重新启动问题的处理
    90%以上的人都存在拖延症状,原来你没有做对这一件事
    我们没得拼爹,只能拼命,但拿什么来拼命?
    我们在努力创建自己的幸福生活,可为什么却常常感受不到幸福?
  • 原文地址:https://www.cnblogs.com/jishumonkey/p/15985973.html
Copyright © 2020-2023  润新知