MySQL 字符集

1、问题描述

Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT)……

查询的一个sql报了错,大致的意思就是sql里面的表混杂了utf8mb4_unicode_ci和utf8mb4_general_ci这两种排序字符集。
sql里面是有join了多张表,可以通过下面的sql查看该表的排序字符集等信息

  1. show table status from 数据库名 like '数据库表名'

2、问题解决

这里采取的措施是统一字符集。
参考:MySQL批量修改 表字段/表/数据库 字符集和排序规则
依次把表字段,表,数据库的字符集修改

(1). 改表字段

'CHARACTER SET utf8 COLLATE utf8_general_ci;' 这里是设置自己想要的字符集;"WHERE TABLE_SCHEMA = '数据库名';"这里是要过滤的条件,比如要过滤的数据库名

  1. -- 改变字段数据
  2. SELECT
  3. TABLE_SCHEMA '数据库',
  4. TABLE_NAME '表',
  5. COLUMN_NAME '字段',
  6. CHARACTER_SET_NAME '原字符集',
  7. COLLATION_NAME '原排序规则',
  8. CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' MODIFY COLUMN ', COLUMN_NAME, ' ', COLUMN_TYPE, ' CHARACTER SET utf8 COLLATE utf8_general_ci;' ) '修正SQL'
  9. FROM
  10. information_schema.`COLUMNS`
  11. WHERE
  12. TABLE_SCHEMA = '数据库名';

然后把“修正SQL”那一列复制出来拿去跑就行了。

(2). 改数据库表的字符集

  1. -- 改变表
  2. SELECT
  3. TABLE_SCHEMA '数据库',
  4. TABLE_NAME '表',
  5. TABLE_COLLATION '原排序规则',
  6. CONCAT( 'ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' COLLATE=utf8_general_ci;' ) '修正SQL'
  7. FROM
  8. information_schema.`TABLES`
  9. WHERE
  10. TABLE_SCHEMA = '数据库名';

(3). 改数据库字符集

  1. -- 修改数据库
  2. SELECT
  3. SCHEMA_NAME '数据库',
  4. DEFAULT_CHARACTER_SET_NAME '原字符集',
  5. DEFAULT_COLLATION_NAME '原排序规则',
  6. CONCAT( 'ALTER DATABASE ', SCHEMA_NAME, ' CHARACTER SET utf8 COLLATE utf8_general_ci;' ) '修正SQL'
  7. FROM
  8. information_schema.`SCHEMATA`
  9. WHERE
  10. SCHEMA_NAME = '数据库名';

3、问题校验

再次执行1中的sql,观察表的字符集是否改变
再次执行sql,sql运行成功