使用正确的字符集/排序规则转储和加载 MySQL
Posted
技术标签:
【中文标题】使用正确的字符集/排序规则转储和加载 MySQL【英文标题】:Dump and load of MySQL with correct charset/collation 【发布时间】:2020-02-07 19:36:00 【问题描述】:我有一个 Bamboo 构建脚本,它向 mysql Admin 发送并执行以下操作:
"C:\Program Files\MySQL\MySQL Utilities 1.6\mysqladmin" -f -h server -u user -p pwd drop db1
"C:\Program Files\MySQL\MySQL Utilities 1.6\mysqladmin" -f -h server -u user -p pwd create db1
"C:\Program Files\MySQL\MySQL Utilities 1.6\mysqldump" db2 -h server -r c:\temp\db2.sql -n --no-data -u user -p pwd
"C:\Program Files\MySQL\MySQL Utilities 1.6\mysql" -h server -D db1 -u user -p pw < c:\temp\db2.sql
代码本质上是删除数据库,重新创建它并从默认数据库 (db2) 加载
问题是db2是下面的charset/collation
而复制的数据库是;
当我们的 MySQL 批量加载器运行并遇到数据中的某些字符时,这会产生问题,例如:
MySql.Data.MySqlClient.MySqlException: Invalid utf8mb4 character string: 'TO CHARGE VOLAC '
我在这个网站和谷歌上花了一些时间,但我尝试过的都没有。
有人能指点我正确的方向吗?
【问题讨论】:
看起来您在删除并重新创建 db1 后立即转储它。这是你所期望的吗? 抱歉,我的代码中可能有错误,因为我正在删除敏感数据。 【参考方案1】:为了回答这个问题,我将“默认数据库”解释为您要复制的数据库来自,而“复制的数据库”解释为您尝试复制到的新数据库。
如果使用SQL命令而不是mysqladmin创建新数据库,可以设置新数据库的字符集:
CREATE DATABASE db1 CHARACTER SET latin1 COLLATE latin1_bin;
从命令行执行:
echo 'CREATE DATABASE db1 CHARACTER SET latin1 COLLATE latin1_bin;' | mysql -h 服务器 -u 用户 -ppw(另外,在您的示例中,-p 后面有一个空格不会正确解释密码,您需要将其附加到 -p)。
【讨论】:
以上是关于使用正确的字符集/排序规则转储和加载 MySQL的主要内容,如果未能解决你的问题,请参考以下文章