2011-05-25 62 views
0

我想將我的一些數據庫表從拉丁文字符集轉換爲utf-8。很多表得到轉換很好,但一些表返回此錯誤:從拉丁文到UTF-8轉換表,關鍵太大問題

ALTER TABLE XYZ轉換爲CHARACTER SET UTF8; 錯誤1118(42000):行大小過大。對於使用的表型的最大行大小,不包括BLOB,爲65535。你必須改變一些列的文字或BLOB的

是否有變通方法嗎?什麼是最小長度列的大小,我應該在表格中進行轉換而不會出現問題?另外,如何更改我需要更改的列而不破壞表中的數據?

這是順便說一句。

mysql> describe trailheads; 
+-----------------------+----------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+-----------------------+----------------+------+-----+---------+----------------+ 
| trailhead_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| trail_id    | int(10)  | YES |  | NULL |    | 
| park_id    | int(10)  | YES |  | NULL |    | 
| editor_member_id  | int(10)  | NO |  | NULL |    | 
| trailhead_name  | varchar(1000) | NO |  | NULL |    | 
| trailhead_description | varchar(20000) | YES |  | NULL |    | 
| parking    | tinyint(1)  | YES |  | NULL |    | 
| parking_spots   | int(5)   | YES |  | NULL |    | 
| is_free    | tinyint(1)  | YES |  | NULL |    | 
| cost_details   | varchar(5000) | YES |  | NULL |    | 
| lat     | float(9,6)  | NO |  | NULL |    | 
| lng     | float(9,6)  | NO |  | NULL |    | 
| bathrooms_nearby  | tinyint(1)  | YES |  | NULL |    | 
| wheelchair_accessible | tinyint(1)  | YES |  | NULL |    | 
| date_added   | date   | NO |  | NULL |    | 
| last_edit_date  | date   | YES |  | NULL |    | 
+-----------------------+----------------+------+-----+---------+----------------+ 
+0

VARCHAR(20000)是我們今天的戰爭和恐怖,用文字的原因,而不是 – Ibu 2011-05-25 07:01:59

回答

4

問題可能是trailhead_description字段。

在較新的mySQL版本中,VARCHAR字段長度表示maximum number of characters而不是字節

由於UTF-8字符長度最多可達四個字節,因此20,000個字符的VARCHAR可能需要多達80,000個字節 - 顯然超出了最大限制。

更改該列TEXT應該工作。

+0

謝謝你 - 如果我將其更改爲文本將發生在數據列是什麼? – Genadinik 2011-05-25 07:06:17

+0

@Genadinik只要它們是相同的編碼,我認爲數據中的任何內容都不應該改變。 (不過,在執行ALTER TABLE之前做一個備份當然總是正確的) – 2011-05-25 07:13:11