是否可以仅通过修改转储的.sql文件将mysql表从utf8迁移到utf8mb4?

是否可以仅通过修改转储的.sql文件将mysql表从utf8迁移到utf8mb4?,mysql,utf-8,mysqldump,utf8mb4,Mysql,Utf 8,Mysqldump,Utf8mb4,假设有两个mysql数据库-src_db具有utf8编码,并且有多个现有表,dst_db具有utf8mb4编码,并且是新创建的。以下步骤能否成功地将src_db中的utf8表迁移到dst_db中的utf8mb4表 首先,从src_db转储 mysqldump src_db -uxxx -pyyy > tbls.sql mysql dst_db -uxxx -pyyy < tbls.sql 然后在sql文件中搜索所有出现的utf8,并将其替换为utf8mb4 sed -i 's/D

假设有两个mysql数据库-
src_db
具有
utf8
编码,并且有多个现有表,
dst_db
具有
utf8mb4
编码,并且是新创建的。以下步骤能否成功地将
src_db
中的
utf8
表迁移到
dst_db
中的
utf8mb4

首先,从
src_db
转储

mysqldump src_db -uxxx -pyyy > tbls.sql
mysql dst_db -uxxx -pyyy < tbls.sql
然后在sql文件中搜索所有出现的
utf8
,并将其替换为
utf8mb4

sed -i 's/DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci/DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci/g' tbls.sql
sed -i 's/COLLATE utf8_unicode_ci/COLLATE utf8mb4_unicode_ci/g' tbls.sql
sed -i 's/character_set_client = utf8/character_set_client = utf8mb4/g' tbls.sql
sed -i 's/SET NAMES utf8/SET NAMES utf8mb4/g' tbls.sql
然后,手动修改
varchar
列上的任何索引,以仅索引该列的前缀。请参见下面的示例。唯一的修改是在索引定义中添加
(191)

CREATE TABLE `tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `index_tbl_on_col` (`col`(191)),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
最后,将sql文件导入
dst_db

mysqldump src_db -uxxx -pyyy > tbls.sql
mysql dst_db -uxxx -pyyy < tbls.sql
mysql dst_db-uxxx-pyyy
导入到
dst_db
的所有表格是否有效
utf8mb4
表格?

最好的方法是测试它;但是是的,这应该很好。我同意它应该有效。如果可能,将
varchar(255)
更改为
191
,而不是使用“前缀”索引。后者有一些问题。@RickJames您所指的确切问题是什么?索引限制为767字节,这对于
VARCHAR(255)utf8
:2(长度)+3(utf8大小)*255“前缀索引”有许多缺陷;最好尽可能避免它们。通过将
VARCHAR
更改为191(如果可能的话),可以避免使用前缀,只需执行
INDEX(col)