我不建議使用「工具」來解決這個問題。
之前你做任何事情轉儲數據庫已在情況下,你搞砸了一個備份;)
,您可以簡化您的字符集和校對兩種方式
方法1:將您的數據
MySQL將您的數據自動轉換成正確的字符集
方法2:改變你的表
如果更改字符集的現有表中,所有現有的內容將也要轉換成
例如
舊錶
CREATE TABLE `myWrongCharsetTable` (
`name` varchar(255) COLLATE latin1_german1_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
放入一些數據進行演示
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
正確的,奇怪的字符集..這是拉丁語1顯示在utf-8控制檯上
# 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
希望這有助於
即使每一列都有不同的字符集,它也不應該使性能嚴重劣化,並且如果一切正常處理,它不應該搞亂特殊字符。您應該提供更多關於究竟發生了什麼的細節。 – deceze
除非這些id字段是文本,否則charset不應該在聯接中影響性能。 –