记录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 会重建表并转换数据,大表需停机维护。

相关推荐
廿一夏7 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim9 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室10 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)10 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
敲个大西瓜10 小时前
Java项目常用数据归档方式
mysql
YOU OU11 小时前
Spring IoC&DI
java·数据库·spring
Muscleheng12 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
kyriewen12 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
小码工作室12 小时前
使用 HAVING 进行 MySQL 集合筛选
mysql
罗超驿13 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试