【问题标题】:Converting table from latin1 to UTF-8, key too large problem将表从 latin1 转换为 UTF-8,键太大问题
【发布时间】:2011-05-25 06:58:05
【问题描述】:

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

alter table xyz 转换为 CHARACTER SET utf8; 错误 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    |                |
+-----------------------+----------------+------+-----+---------+----------------+

【问题讨论】:

  • varchar(20000) 是我们今天发生战争和恐怖的原因,请改用 TEXT

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


【解决方案1】:

问题可能是trailhead_description 字段。

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

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

将该列更改为TEXT 应该可以工作。

【讨论】:

  • 谢谢 - 如果我将列中的数据更改为文本会怎样?
  • @Genadinik 只要它们的编码相同,我认为数据中的任何内容都不会改变。 (不过,在执行 ALTER TABLE 之前进行备份当然总是正确的)
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2013-02-25
  • 2013-09-18
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2011-09-05
相关资源
最近更新 更多