将表从latin1转换为UTF-8,键太大问题

时间:2011-05-25 06:58:06

标签: mysql database database-design utf-8 latin1

我正在尝试将一些数据库表从latin1字符集转换为utf-8。许多表转换得很好,但有些表返回此错误:

alter table xyz convert to CHARACTER SET utf8; ERROR 1118(42000):行大小太大。使用的表类型的最大行大小(不计算BLOB)是65535.您必须将某些列更改为TEXT或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    |                |
+-----------------------+----------------+------+-----+---------+----------------+

1 个答案:

答案 0 :(得分:4)

问题可能是trailhead_description字段。

在较新的mySQL版本中,VARCHAR字段长度表示maximum number of characters而不是字节

因为UTF-8字符最长可达4个字节,所以20,000个字符VARCHAR可能需要多达80,000个字节 - 显然超出了最大限制。

将该列更改为TEXT应该有效。