zoukankan      html  css  js  c++  java
  • MySql Illegal mix of collations 问题

    背景

    实际问题复杂一些,最终发现是一个select语句有问题,这里做一个抽象的记录:

    select * from view_a where field_a = '是';
    

    报错collations不匹配,也就是标题中的错误。那么collation是什么?

    创建数据库时,可以指定character set,比如utf8。而collation是指定的字符集下的排序规则。

    当两个字符串比较时,需要用相同的规则才可以进行对比。

    collation的生成规则

    具体可以参考MYSQL的官方文档,在这里,简单来说。

    1. 有指定用指定
    2. 没有指定,如果指定了字符集,则用字符集默认(可以用SHOW CHARACTER SET命令查看字符集的默认collation)
    3. 如果都没有指定,则使用链接数据库的collation_connection系统变量。

    原因分析

    在我的例子中,出问题的field_a用了utf8_unicode_ci,而字符串,用了utf8_general_ci

    而我检查了field_a的定义,发现是一个case when语句生成的字符串,按道理不应该和查询语句例得字符串使用不同的collation

    解决方案

    第一种

    一开始没有深入分析,查询到可以在sql语句中强制指定比较用的collation:

    select * from view_a where field_a =  '是' collate utf8_general_ci ;
    

    这样就不会报错

    第二种

    从源头上解决。接着之前的设想,估计是第一次建立这个视图的时候,连接数据库时(或者连接的工具)里设置了另外的默认collation,导致跟默认的不同。

    于是我在本机重新创建了这个视图,再运行原始sql,就没有问题了。

  • 相关阅读:
    cmake常用工程示例大集合
    qt---cdb(Microsoft Console Debugger)调试
    Qt Creator设置多核编译(-j8参数)
    这都是些老观点了。世界在变,时代在变。中国人观念进步的更快
    微软全球执行副总裁沈向洋:三年内用人工智能赚100亿美元
    C# 6.0
    node.js + mongodb
    分布式消息系统kafka
    jQuery插件开发
    jqgrid-asp.net-mvc
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/13646414.html
Copyright © 2011-2022 走看看