最近遇到了个关于修改表字符集的问题。原因是线上库表为utf8字符集碰到生僻字导致了应用报错的问题。在商量后决定修改整个库的字符集由utf8转成uft8mb4。修改字符集当时有两个方案一个是将库进行迁移到utf8mb4
的库上,另一种使用SQL将所有表进行字符集转换。这次线上虽然决定使用迁移的方法,但这里想加深了解下关于SQL转换的方法,所以有了这篇记录。

SQL语法
整表进行转换
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
复制
为了将表的默认字符集和所有的字符串 (char,varchar,text
) 转换成新的字符集就可以使用上面这个SQL。它不仅可以转换字符集还可以转换字符串的collation
。
当不指定collation
会使用和character set
相匹配的collation
。所以想指定则需要自己显示的写到SQL中。
当想使用默认字符集(character_set_database
)可以使用如下SQL
alter table tbl_name convert to character set default;
复制
只对一列的字符集转换
ALTER TABLE t1 CHANGE col col TEXT CHARACTER SET utf8;
复制
如果你只想修改一个表中的某一列的字符集,则可以使用这个SQL,但是想修改多个列就需要写相应列的SQL了
如果只是想转换默认字符集
ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8;复制
他不会将已存的数据进行转换只会将字符集修改过来。
若只想修改表的默认字符集
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
复制
该SQL会指定该表后面加列在未显性指定字符集情况下使用的默认字符集。
注意点
在进行转换时需要注意有每个字符存储占小的字符集(latin1,utf8)转成较大的字符集(utf8mb4)时注意存储空间不足的问题 在开启 foreign_key_checks
时,是不允许对存在外键的表进行字符集转换操作的。所以,必须在开启foreign_key_checks
参数将相关的父子表都完成字符集转换。否则ON DELETE CASCADE
则ON UPDATE CASCADE
操作可能会损坏引用表中的数据,因为在这些操作期间会发生隐式转换(错误 #45290、错误 #74816)。
文章转载自天天李拜天DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
墨天轮个人数说知识点合集
JiekeXu
382次阅读
2025-04-01 15:56:03
MySQL数据库当前和历史事务分析
听见风的声音
380次阅读
2025-04-01 08:47:17
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
353次阅读
2025-03-28 16:28:31
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
307次阅读
2025-04-15 14:48:05
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
281次阅读
2025-04-15 23:49:58
MySQL8.0直方图功能简介
Rock Yan
280次阅读
2025-03-21 15:30:53
云和恩墨杨明翰:安全生产系列之MySQL高危操作
墨天轮编辑部
267次阅读
2025-03-27 16:45:26
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
248次阅读
2025-04-07 12:14:29
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
187次阅读
2025-04-17 17:02:24
PG vs MySQL 执行计划解读的异同点
进击的CJR
173次阅读
2025-03-21 10:50:08