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

相关推荐
架构师老Y2 小时前
013、数据库性能优化:索引、查询与连接池
数据库·python·oracle·性能优化·架构
AC赳赳老秦2 小时前
OpenClaw数据库高效操作指南:MySQL/PostgreSQL批量处理与数据迁移实战
大数据·数据库·mysql·elasticsearch·postgresql·deepseek·openclaw
一 乐2 小时前
校园线上招聘|基于springboot + vue校园线上招聘系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园线上招聘系统
liliangcsdn2 小时前
如何基于sentence_transformers构建向量计算工具
数据库·人工智能·全文检索
rchmin2 小时前
向量数据库Milvus安装及使用实战经验分享
数据库·milvus
ego.iblacat2 小时前
Python 连接 MySQL 数据库
数据库·python·mysql
祖传F872 小时前
quickbi数据集数据查询时间字段显示正确,仪表板不显示
数据库·sql·阿里云
Leon-Ning Liu3 小时前
Oracle 26ai新特性:时区、表空间、审计方面的新特性
数据库·oracle
humors2213 小时前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包