记录mysql创建数据库未指定字符集引发的问题及解决方法

问题描述

在执行某个存储过程时报告了以下错误:

复制代码
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

检查所有参与比较的字段,使用的都是utf8mb4_unicode_ci排序规则,后确认是数据库默认排序规则为utf8mb4_0900_ai_ci导致。

  • 查看当前数据库默认排序规则

    SELECT DEFAULT_COLLATION_NAME
    FROM information_schema.SCHEMATA
    WHERE SCHEMA_NAME = 'your_db_name';

输出以下内容:

复制代码
+------------------------+
| DEFAULT_COLLATION_NAME |
+------------------------+
| utf8mb4_0900_ai_ci     |
+------------------------+
1 row in set (0.00 sec)
  • 查看会话默认

    SHOW VARIABLES LIKE 'collation%';

输出以下内容:

复制代码
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database   | utf8mb4_0900_ai_ci |
| collation_server     | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
  • 查看数据库创建语句

    show create database your_db_name;

输出以下内容:

复制代码
CREATE DATABASE `your_db_name` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */

解决方案(任选其一)

1. 在存储过程中定义变量时指定排序规则

复制代码
DECLARE mchId VARCHAR(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. 修改数据库默认排序规则

  • 找到配置文件位置(常见路径):

    • Linux: /etc/my.cnf 或 /etc/mysql/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
    • Windows: my.ini(通常在 MySQL 安装目录下)
  • 在 [mysqld] 段落下添加:

    [mysqld]

    字符集和排序规则统一为 utf8mb4 + utf8mb4_unicode_ci

    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

    可选:确保客户端也使用一致设置(避免连接层问题)

    skip-character-set-client-handshake
    init-connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'

skip-character-set-client-handshake 强制所有客户端使用服务器默认字符集(谨慎使用,某些旧客户端可能不兼容)。

  • 保存后重启 MySQL:

    Ubuntu/Debian

    sudo systemctl restart mysql

    CentOS/RHEL

    sudo systemctl restart mysqld

    Windows:通过服务管理器重启 MySQL

  • 验证配置是否生效

    SHOW VARIABLES LIKE 'character_set_server';
    -- 应返回 utf8mb4

    SHOW VARIABLES LIKE 'collation_server';
    -- 应返回 utf8mb4_unicode_ci

3. 修改现有数据库的默认排序规则(推荐)

  • 执行以下语句修改db排序规则

    ALTER DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

  • 修改现有表的字段排序规则

    -- 生成 ALTER TABLE 语句(检查是否有不一致的字段)
    SELECT
    CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') AS alter_sql
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'your_db_name';

然后执行输出的 SQL(谨慎操作,先备份!)。

注意:CONVERT TO 会重建表并转换数据,大表需停机维护。

相关推荐
Dontla13 小时前
Python asyncpg库介绍(基于Python asyncio的PostgreSQL数据库驱动)连接池、SQLAlchemy
数据库·python·postgresql
俺不要写代码13 小时前
数据库:DQL
数据库·sql·mysql
zh15702313 小时前
如何编写动态SQL存储过程_使用sp_executesql执行灵活查询
jvm·数据库·python
2401_8242226913 小时前
SQL报表统计数据量巨大_分批统计策略
jvm·数据库·python
俺不要写代码13 小时前
数据库:DCL
数据库
X566113 小时前
mysql如何处理连接数过多报错_调整max_connections参数
jvm·数据库·python
学习3人组13 小时前
OEE(设备综合效率)的标准定义、公式、损失分类、以及在工位触屏/MES里怎么采集和统计
大数据·网络·数据库
张~颜13 小时前
PostgreSQL数据压缩技术
数据库·postgresql
m0_6091604913 小时前
MongoDB中什么是Hashed Shard Key的哈希冲突_哈希函数的分布均匀性分析
jvm·数据库·python
小碗羊肉14 小时前
【MySQL | 第十一篇】InnoDB引擎
java·数据库·mysql