GCP MySQL Cloud SQL 数据库无法正确导出多字节 UTF-8 字符
GCP MySQL Cloud SQL database does not properly export multibyte UTF-8 characters
当我创建 MySQL 云 SQL 数据库的备份时,它无法正确导出它包含的 UTF-8 多字节字符。
我觉得这是一个错误。但这可能是我遗漏了什么。我希望有人能帮助我!
重现步骤:
创建一个新的 Cloud SQL MySQL 数据库。使用版本 5.7。请务必将标志 character_set_server
设置为 utf8mb4
。
使用 character_set
到 utf8mb4
和 collation
到 utf8mb4_unicode_ci
创建一个新数据库。
填充数据库:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
CREATE TABLE `slug` (
`slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO demo.slug VALUES ('');
我验证了我可以使用以下方法正确取回这些值:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
SELECT * FROM demo.slug;
使用控制台提供的内置导出机制。
当您下载生成的 SQL 文件时,相关的 INSERT
语句将如下所示。并包含问号,而不是有效的 UTF-8 字符。
INSERT INTO `slug` VALUES ('???');
请注意,当我在第 4 步中省略 SET NAMES
部分时,我也会得到准确的值。
我尝试像您一样通过控制台进行操作,但遇到了同样的问题。
对我有用的解决方法是这个:
1) 将您的 GCP 项目的 public IP 列入白名单
STORAGE > SQL > your instance > CONNECTIONS > Connectivity > +Add
network
通过运行这个命令可以得到publicIP dig +short myip.opendns.com @resolver1.opendns.com
2) 通过 运行 这个命令创建一个 .sql 文件:mysqldump --databases [YOUR_DB_NAME] -h [YOUR_INSTANCE_PUBLIC_IP] -u [YOUR_USER] -p --default-character-set=utf8mb4 > [FILE_NAME].sql
3) 通过 运行 命令将文件移动到存储桶中:gsutil mv [FILE_NAME].sql gs://[YOUR_BUCKET_NAME]/
4) 然后通过控制台导入文件,选择所需的数据库。
我试过了,对我有用。
编辑:忽略以下内容——成功可能是蜜蜂,因为构成我测试的字符的字节也是有效的 latin-1 字符...
It seems that this only affects 4-byte UTF-8 encoded characters (which
includes all the emoticons, etc.)
Trying with a 3-byte character such as Cyrillic Zemlya (Ꙁ utf8=ea9980)
or a 2-byte character such as Greek Epsilon (Ɛ utf-8=ceb5) succeeds.
Note that Cloud SQL backups do not use exports, so they are not
affected.
我得到了Google的回复:工程部已经意识到这一点。但是,没有更改的预计到达时间。所以没有办法解决这个问题。同时,进行有效备份的唯一方法是使用 iker 的说明。
当我创建 MySQL 云 SQL 数据库的备份时,它无法正确导出它包含的 UTF-8 多字节字符。
我觉得这是一个错误。但这可能是我遗漏了什么。我希望有人能帮助我!
重现步骤:
创建一个新的 Cloud SQL MySQL 数据库。使用版本 5.7。请务必将标志
character_set_server
设置为utf8mb4
。使用
character_set
到utf8mb4
和collation
到utf8mb4_unicode_ci
创建一个新数据库。填充数据库:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; CREATE TABLE `slug` ( `slug` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO demo.slug VALUES ('');
我验证了我可以使用以下方法正确取回这些值:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; SELECT * FROM demo.slug;
使用控制台提供的内置导出机制。
当您下载生成的 SQL 文件时,相关的
INSERT
语句将如下所示。并包含问号,而不是有效的 UTF-8 字符。INSERT INTO `slug` VALUES ('???');
请注意,当我在第 4 步中省略
SET NAMES
部分时,我也会得到准确的值。
我尝试像您一样通过控制台进行操作,但遇到了同样的问题。 对我有用的解决方法是这个:
1) 将您的 GCP 项目的 public IP 列入白名单
STORAGE > SQL > your instance > CONNECTIONS > Connectivity > +Add network
通过运行这个命令可以得到publicIP dig +short myip.opendns.com @resolver1.opendns.com
2) 通过 运行 这个命令创建一个 .sql 文件:mysqldump --databases [YOUR_DB_NAME] -h [YOUR_INSTANCE_PUBLIC_IP] -u [YOUR_USER] -p --default-character-set=utf8mb4 > [FILE_NAME].sql
3) 通过 运行 命令将文件移动到存储桶中:gsutil mv [FILE_NAME].sql gs://[YOUR_BUCKET_NAME]/
4) 然后通过控制台导入文件,选择所需的数据库。
我试过了,对我有用。
编辑:忽略以下内容——成功可能是蜜蜂,因为构成我测试的字符的字节也是有效的 latin-1 字符...
It seems that this only affects 4-byte UTF-8 encoded characters (which includes all the emoticons, etc.)
Trying with a 3-byte character such as Cyrillic Zemlya (Ꙁ utf8=ea9980) or a 2-byte character such as Greek Epsilon (Ɛ utf-8=ceb5) succeeds.
Note that Cloud SQL backups do not use exports, so they are not affected.
我得到了Google的回复:工程部已经意识到这一点。但是,没有更改的预计到达时间。所以没有办法解决这个问题。同时,进行有效备份的唯一方法是使用 iker 的说明。