在我目前的情况下,我有 mysql 数据库,数据库和表上的排序规则和字符集设置为 utf8,但所有数据仍然是 latin1。这是由于服务器配置 (my.cnf) 有:
character-set-server = latin1
Run Code Online (Sandbox Code Playgroud)
以下是有关旧数据库服务器的更多信息:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)
现在我们有了新的正确配置的完整 UTF-8 数据库实例,我需要转储数据。我一直在尝试不同的方式,但没有任何运气。现在原始数据库上的数据是乱码,我需要将其导出到完整的 UTF-8 数据库。
我试过这个:
mysqldump -h DB_HOST -u DB_USER -p DB_PASSWORD --opt --quote-names \
--skip-set-charset --default-character-set=latin1 DB_NAME > DB_NAME-dump.sql
mysql -h DB_HOST -u DB_USER -p DB_PASSWORD \
--default-character-set=utf8 DB_NAME < DB_NAME-dump.sql
Run Code Online (Sandbox Code Playgroud)
但这无济于事,因为 .sql 文件和新数据库中的数据是 UTF-8 乱码
在阅读了各种问题并尝试了不同的方法后,这就是我的解决方案:
转储必须像这样完成(确保将文件名作为 -r 参数传递):
mysqldump -h HOST -u USER -p --default-character-set=latin1 DATABASE -r utf8.dump
Run Code Online (Sandbox Code Playgroud)
然后我打开了 utf8.dump 文件并在顶部更改了一行。
从
/*!40101 SET NAMES latin1 */;
Run Code Online (Sandbox Code Playgroud)
到
/*!40101 SET NAMES utf8 */;
Run Code Online (Sandbox Code Playgroud)
然后我将它导入(确保使用 mysql 而不是 mysqldump 并获取文件,不要使用“<”从终端传递它):
mysql -u USER -p DB -h HOST
mysql> source utf8.dump
Run Code Online (Sandbox Code Playgroud)
在此之后,我所有的数据都被正确编码并存储为 UTF-8(例如 hét -> hét)
归档时间: |
|
查看次数: |
13651 次 |
最近记录: |