我不建议使用“工具”来解决这个问题。
在您做任何事情之前转储您的数据库以进行备份,以防万一您搞砸了;)
您可以通过两种方式简化字符集和排序规则
方法 1:移动数据
创建一个全新的数据库,在所有表中配置正确的字符集和排序规则
用 INSERT SELECT 语句填充新表,例如
插入到newdatabase
. table
选择 * 从olddatabase
。table
MySQL 会自动将您的数据转换为正确的字符集
方法2:改变你的表
如果更改现有表的字符集,所有现有内容也将被转换
例如
旧桌子
CREATE TABLE `myWrongCharsetTable` (
`name` varchar(255) COLLATE latin1_german1_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
放一些数据做demo
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'I am a latino string' );
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'Mein Name ist Müller' );
INSERT INTO `myWrongCharsetTable` (`name`) VALUES ( 'Mein Name ist Möller' );
SELECT * FROM myWrongCharsetTable INTO outfile '/tmp/mylatinotable.csv';
在 UTF-8 控制台上,我这样做
# cat /tmp/mylatinotable.csv
I am a latino string
Mein Name ist M▒ller
Mein Name ist M▒ller
对,奇怪的字符集..这是在 utf-8 控制台上显示的 latin 1
# cat /tmp/mylatinotable.csv | iconv -f latin1 -t utf-8
I am a latino string
Mein Name ist Müller
Mein Name ist Möller
是的,一切都好
那么我现在该如何解决这个问题?
ALTER TABLE myWrongCharsetTable
MODIFY name varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
DEFAULT CHARSET = utf8 COLLATE utf8_unicode_ci;
就是这样 :)
再次写入outfile
mysql> SELECT * FROM myWrongCharsetTable INTO outfile '/tmp/latinoutf8.csv';
Query OK, 3 rows affected (0.01 sec)
mysql> exit
Bye
dbmaster-001 ~ # cat /tmp/latinoutf8.csv
I am a latino string
Mein Name ist Müller
Mein Name ist Möller
工作,一切都很好,我们很高兴
编辑:
其实还有一种方法
方法 3:转储、修改和重新加载数据
如果您擅长 sed 和 awk,您可以自动执行此操作,或手动编辑文件
# dump the structure, possibly routines and triggers
mysqldump -h yourhost -p -u youruser --no-data --triggers --skip-comments --routines yourdatabase > database_structure_routines.sql
# dump the data
mysqldump -h yourhost -p -u youruser --no-create-info --skip-triggers --skip-routines yourdatabase > database_data.sql
现在database_structure_routines.sql
在您选择的编辑器中打开并根据需要修改表格
我建议在您的转储文件中删除所有评论,例如 /*!40101 SET character_set_client = utf8 */ 因为这可能会覆盖表默认值
完成后,创建一个新的数据库和结构
mysql > CREATE DATABASE `newDatabase` DEFAULT CHARSET utf8 COLLATE utf8_unicode_ci;
mysql > use `newDatabase`
mysql > ./database_structure_routines.sql;
不要忘记重新检查您的表格
mysql > SHOW CREATE TABLE `table`;
如果没关系,您可以重新导入数据,字符集转换将自动完成
mysql -h yourhost -p -u youruser newDatabase < database_data.sql
希望这可以帮助