首页 > 解决方案 > GCP MySQL Cloud SQL 数据库无法正确导出多字节 UTF-8 字符

问题描述

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

我觉得这是一个错误。但这可能是我遗漏了一些东西。我希望有人可以帮助我!

重现步骤:

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

  2. character_set使用toutf8mb4collationto创建一个新数据库utf8mb4_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 ('???');
    

    请注意,当我省略SET NAMES第 4 步中的部分时,我也会得到该确切值。

标签: mysqlutf-8google-cloud-platformgoogle-cloud-sqlmysql-5.7

解决方案


我尝试像您一样通过控制台进行操作,但遇到了同样的问题。对我有用的解决方法是这个:

1)将您的GCP项目的公共IP列入白名单

STORAGE > SQL > your instance > CONNECTIONS > Connectivity > +Add network

通过运行此命令,您可以获得公共 IPdig +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)然后你通过控制台导入文件,选择你想要的数据库。

我已经尝试过了,它对我有用。


推荐阅读