2011-02-05 97 views
2

雖然他們的數據實際上是希臘語(單字節),但我有幾個標記爲utf8的表(可能是由於從幾年前從另一個服務器導入時出錯)。有沒有什麼辦法可以改變表格的編碼而不讓MySQL嘗試轉換數據呢?如何在不更改數據的情況下更改表格編碼?

編輯以避免更多的誤解:數據不是UTF-8。它只是標記爲這樣。我想更改表的編碼以反映數據的實際編碼,以便我可以繼續將其轉換爲utf8。

謝謝。

回答

1

顯然,解決的辦法是導出原始數據(SELECT * INTO OUTFILE ...),使用的iconv命令行從UTF8轉換爲latin1然後導入回(LOAD DATA INFILE ... CHARACTER SET GREEK):)

3

你需要考慮的第一件事是 - 爲什麼改變工作? UTF-8適用於存儲希臘語。

數據庫服務器上的空間真的太大了,以至於這麼大的改變會節省很多嗎?


至於改變編碼而不轉換數據 - 不,這是不可能的。數據以UTF-8格式存儲,需要轉換爲正確的編碼,否則最終會出現一組不可讀的列。


更新:

如果數據已經在正確的編碼,更改編碼無需轉換仍可能落得損壞的數據。爲什麼?由於UTF-8不是單字節字符集,列類型決定了數據庫引擎如何存儲和訪問磁盤上的數據。

我建議嘗試 - 在測試表中創建一個UTF-8列,用現有數據填充並轉換。如果列類型更改沒有轉換成功,那麼您就很好。

+0

不,你不明白。 **數據不是utf8 **。它只是標記爲這樣。我想更改編碼以反映數據的實際編碼,以便我編寫的將它們轉換爲utf8的腳本可以正常工作。 – 2011-02-05 21:22:49

0

這是一個veeeery舊的文章,但仍然沒有正確的答案...

我已經遇到了這個問題,因爲我對之前使用過的問題的方法有些不起作用。幸運的是,我發現我的問題不是我的方法,而是工具 - phpMyAdmin。我已經使用MySQL控制檯完成了相同的工作,並且完美地工作。

解決方案

如果MySQL認爲該數據是在一個字符集(即UTF8),但實際的數據是在其他一些字符集(如latin1的),那麼解決方案是將列轉換(S )與文本的字符集不知道類型像VARBINARYBLOB/MEDIUMBLOB ...然後轉換回字符集感知柱(一個或多個),同時設置正確的字符集。

如果你有一個MEDIUMTEXT類型列ŸXLATIN1而MySQL的思想,它是在一些其他的字符集(在你的情況UTF8)的數據,使用下面的恢復說明資訊:

mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMBLOB; 
mysql> ALTER TABLE `x` CHANGE `y` `y` MEDIUMTEXT CHARACTER SET latin1 COLLATE latin1_general_ci; 

你必須要,當然要確保該字符集是由MySQL的實例支持。

相關問題