MySQL批量替换数据库字符集的实用方法(附详细代码)

 更新时间:2025年09月22日 11:26:01   作者:禹迹  
当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面这篇文章主要介绍了MySQL批量替换数据库字符集的实用方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在日常的数据库运维或系统迁移过程中,我们经常会遇到这样的问题:

数据库和表的字符集不统一,或者需要统一升级到更合适的字符集(例如 utf8mb4)以支持更多字符。

手动逐个表、逐个字段修改字符集不仅耗时,还容易遗漏。本文将通过一段 SQL 脚本,向大家介绍如何批量替换 MySQL 数据库的字符集,从而简化操作并降低风险。

为什么要批量修改字符集?

  1. 统一性:确保所有表和字段的字符集一致,避免查询或插入时出现乱码。
  2. 兼容性:例如 utf8 在 MySQL 实际上只支持最多 3 字节,而 utf8mb4 才是真正的 UTF-8,可以支持 Emoji 等四字节字符。
  3. 可维护性:统一的标准字符集让团队协作和后期维护更加方便。

整体脚本

-- 替换为你的数据库名
SET @db_name = '你的数据库名';
SET @charset = 'utf8mb4';
SET @collation = 'utf8mb4_unicode_520_ci';

-- 生成修改表默认字符集的语句
SELECT CONCAT(
    'ALTER TABLE `', table_name, '` DEFAULT CHARACTER SET ', @charset, ' COLLATE ', @collation, ';'
) AS alter_table_sql
FROM information_schema.tables 
WHERE table_schema = @db_name 
  AND table_type = 'BASE TABLE'; -- 只处理用户表,排除视图等

-- 生成修改所有字符串字段的语句
SELECT CONCAT(
    'ALTER TABLE `', c.table_name, '` MODIFY COLUMN `', c.column_name, '` ',
    c.data_type, 
    IF(c.character_maximum_length IS NOT NULL, CONCAT('(', c.character_maximum_length, ')'), ''),
    ' CHARACTER SET ', @charset, ' COLLATE ', @collation,
    IF(c.is_nullable = 'NO', ' NOT NULL', ' NULL'),
    IF(c.column_default IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(c.column_default)), ''),
    ' COMMENT ', QUOTE(c.column_comment), ';'
) AS alter_column_sql
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE c.table_schema = @db_name
  AND t.table_type = 'BASE TABLE'
  AND c.data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') -- 所有字符串类型
  AND (c.character_set_name IS NULL OR c.character_set_name != @charset OR c.collation_name != @collation);

脚本逻辑解析

以下脚本分为两部分,分别用于生成修改 表的默认字符集字段字符集 的 SQL 语句。

1. 设置目标参数

-- 替换为你的数据库名
SET @db_name = '你的数据库名';
SET @charset = 'utf8mb4';
SET @collation = 'utf8mb4_unicode_520_ci';
  • @db_name:要操作的数据库名。
  • @charset:目标字符集。这里我们指定为 utf8mb4
  • @collation:排序规则,推荐使用 utf8mb4_unicode_520_ci,兼容性和排序效果更好。

2. 生成修改表默认字符集的语句

SELECT CONCAT(
    'ALTER TABLE `', table_name, '` DEFAULT CHARACTER SET ', @charset, ' COLLATE ', @collation, ';'
) AS alter_table_sql
FROM information_schema.tables 
WHERE table_schema = @db_name 
  AND table_type = 'BASE TABLE'; -- 只处理用户表,排除视图等

这段 SQL 会从 information_schema.tables 中读取所有用户表,并生成相应的 ALTER TABLE 语句。
作用是修改表的默认字符集和排序规则,这样以后新建字段时会自动使用指定的字符集。

3. 生成修改所有字符串字段的语句

SELECT CONCAT(
    'ALTER TABLE `', c.table_name, '` MODIFY COLUMN `', c.column_name, '` ',
    c.data_type, 
    IF(c.character_maximum_length IS NOT NULL, CONCAT('(', c.character_maximum_length, ')'), ''),
    ' CHARACTER SET ', @charset, ' COLLATE ', @collation,
    IF(c.is_nullable = 'NO', ' NOT NULL', ' NULL'),
    IF(c.column_default IS NOT NULL, CONCAT(' DEFAULT ', QUOTE(c.column_default)), ''),
    ' COMMENT ', QUOTE(c.column_comment), ';'
) AS alter_column_sql
FROM information_schema.columns c
JOIN information_schema.tables t ON c.table_name = t.table_name AND c.table_schema = t.table_schema
WHERE c.table_schema = @db_name
  AND t.table_type = 'BASE TABLE'
  AND c.data_type IN ('varchar', 'char', 'text', 'tinytext', 'mediumtext', 'longtext') -- 所有字符串类型
  AND (c.character_set_name IS NULL OR c.character_set_name != @charset OR c.collation_name != @collation);

这段 SQL 主要针对已有的字符串字段,逐一生成 ALTER TABLE ... MODIFY COLUMN 语句:

  • 只选择了 字符串类型字段varchar, char, text 等)。
  • 保留了原有的字段长度(character_maximum_length)。
  • 保留了字段是否可为空(is_nullable)。
  • 保留了默认值(column_default)。
  • 保留了字段注释(column_comment)。
  • 仅在字段字符集或排序规则与目标不一致时才生成语句,避免重复修改。

使用步骤

  1. 替换数据库名
    将脚本中的 SET @db_name = '你的数据库名'; 修改为实际要操作的数据库名。

  2. 执行脚本
    在 MySQL 客户端或工具(如 Navicat、DBeaver)中运行以上 SQL。

  3. 复制结果并执行
    脚本本身不会直接修改数据库,而是生成一批 ALTER 语句
    你需要将结果导出或复制出来,再次执行这些 ALTER 语句,才能真正完成修改。

示例输出

假设数据库 test_db 有一张 users 表,里面有一个 name 字段:

执行脚本后可能会生成如下语句:

ALTER TABLE `users` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

ALTER TABLE `users` MODIFY COLUMN `name` varchar(255) 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL 
COMMENT '用户名';

结果1替换表的字符集,结果2替换字段的字符集

注意事项

  1. 备份数据:在批量修改前,一定要做好数据库备份,以防万一。
  2. 锁表风险ALTER TABLE 会对表加锁,大表执行时可能会阻塞业务,建议在业务低峰期操作。
  3. 兼容性验证:部分排序规则在 MySQL 版本之间可能有所差异,请确认目标环境支持。

总结 

到此这篇关于MySQL批量替换数据库字符集的实用方法的文章就介绍到这了,更多相关MySQL批量替换数据库字符集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法

    MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法

    这篇文章主要介绍了MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下
    2017-07-07
  • MySQL修改时间添加时间自动更新的两种方法

    MySQL修改时间添加时间自动更新的两种方法

    这篇文章主要介绍了MySQL修改时间添加时间自动更新的两种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • InnoDB存储引擎中的表空间详解

    InnoDB存储引擎中的表空间详解

    这篇文章主要介绍了InnoDB存储引擎中的表空间详解,表空间内部,所有页按照区extent为物理单元进行划分和管理,extent由64个物理连续的页组成,表空间可以理解为由一个个物理相邻的extent组成,需要的朋友可以参考下
    2023-09-09
  • mysql数据如何通过data文件恢复

    mysql数据如何通过data文件恢复

    这篇文章主要介绍了mysql数据如何通过data文件恢复问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • sysbench对mysql压力测试的详细教程

    sysbench对mysql压力测试的详细教程

    众所周知sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。下面这篇文章就来详细介绍sysbench如何对mysql进行压力测试,有需要的可以一起来看看。
    2016-09-09
  • mysql ifnull不起作用原因分析以及解决

    mysql ifnull不起作用原因分析以及解决

    这篇文章主要介绍了mysql ifnull不起作用原因分析以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 一篇文章带你轻松了解MySQL之事务的简介

    一篇文章带你轻松了解MySQL之事务的简介

    事务可以由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成,事务的目的是将数据库从一种一致性状态转换为另一种一致性状态,下面这篇文章主要给大家介绍了关于MySQL事务简介的相关资料,需要的朋友可以参考下
    2023-06-06
  • 总结三道MySQL联合索引面试题

    总结三道MySQL联合索引面试题

    这篇文章主要介绍了总结三道MySQL联合索引面试题,众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循,创建联合索引的时候,建议优先把区分度高的字段放在第一列
    2022-08-08
  • mysql数据库表增添字段,删除字段,修改字段的排列等操作

    mysql数据库表增添字段,删除字段,修改字段的排列等操作

    这篇文章主要介绍了mysql数据库表增添字段,删除字段,修改字段的排列等操作,修改表指的是修改数据库之后中已经存在的数据表的结构
    2022-07-07
  • 深入mysql创建自定义函数与存储过程的详解

    深入mysql创建自定义函数与存储过程的详解

    本篇文章是对mysql创建自定义函数与存储过程进行了详细的分析介绍,需要的朋友参考下
    2013-06-06

最新评论