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

相关推荐
云贝贝贝18 分钟前
腾讯云 TDSQL(MySQL 版)运维高频 6 坑:代理路由、读写分离、分片键、监控、PITR
运维·mysql·腾讯云
wxwx_bscxy32222 分钟前
基于Python新冠疫情可视化分析系统的设计与实现
java·数据库·spring boot·python·微信小程序·sqlite
剑之所向1 小时前
.NET 官方`System.Threading.Channels`
前端·javascript·数据库
词却2 小时前
数据库基础:DQL 数据查询语言
数据库·oracle
昌原的儿子LEO4 小时前
Linux IO多路复用与SQLite数据库核心知识点总结
linux·数据库·oracle
山岚的运维笔记4 小时前
mysql 专业笔记 -- 第 8 章:使用变量
运维·数据库·笔记·后端·学习·mysql·dba
聚美智数4 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
坐吃山猪5 小时前
【多线程】Semaphore使用
java·数据库·oracle·多线程
数智启示录5 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
姜太小白6 小时前
【Oracle】记排查sh脚本调用SQL执行卡顿的排查总结
数据库·sql·oracle