GCP MySQL Cloud SQL 数据库无法正确导出多字节 UTF-8 字符

GCP MySQL Cloud SQL database does not properly export multibyte UTF-8 characters

当我创建 MySQL 云 SQL 数据库的备份时,它无法正确导出它包含的 UTF-8 多字节字符。

我觉得这是一个错误。但这可能是我遗漏了什么。我希望有人能帮助我!

重现步骤:

  1. 创建一个新的 Cloud SQL MySQL 数据库。使用版本 5.7。请务必将标志 character_set_server 设置为 utf8mb4

  2. 使用 character_setutf8mb4collationutf8mb4_unicode_ci 创建一个新数据库。

  3. 填充数据库:

    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 ('');
    
  4. 我验证了我可以使用以下方法正确取回这些值:

    SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
    SELECT * FROM demo.slug;
    
  5. 使用控制台提供的内置导出机制。

  6. 当您下载生成的 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 的说明。