mysql varchar2行溢出

时间:2011-12-11 15:07:32

标签: mysql varchar

我有一个mysql 5.1.50服务器。 我最近为一些旧表创建了一个转储文件,其中的数据是从旧版本的mysql转换而来的。 在导入过程中,我收到了“数据截断列”消息。短搜索显示存在varchar值超过表的已定义varchar值的行。

  1. 怎么可能?试图重建它没有成功,有没有人遇到过这样的状态?
  2. 如何在没有全表扫描整个数据库的情况下找到有问题的行?
  3. 最重要的是,这可以修复(再次,使用一个简单的解决方案,完全drop-create不会有帮助)
  4. 来自db的

    (数据被遮挡但是真正的提取):

    desc xxx
    
    +----------------+------------------+------+-----+---------+----------------+
    | Field          | Type             | Null | Key | Default | Extra          |
    +----------------+------------------+------+-----+---------+----------------+
    | id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | date           | date             | NO   | MUL | NULL    |                |
    | int1           | int(10) unsigned | NO   |     | NULL    |                |
    | v1             | varchar(200)     | NO   |     | NULL    |                |
    | v2             | varchar(200)     | NO   |     | NULL    |                |
    | i2             | int(10) unsigned | NO   |     | NULL    |                |
    | i3             | int(10) unsigned | NO   |     | NULL    |                |
    | f1             | float            | NO   |     | NULL    |                |
    | f2             | float            | NO   |     | NULL    |                |
    +----------------+------------------+------+-----+---------+----------------+
    
    select count(id) from xxx where length(v1)>200 group by length(v1);
    
    +-----------+------------------+
    | count(id) | length(v1)       |
    +-----------+------------------+
    |         7 |              201 |
    |         1 |              202 |
    |         1 |              203 |
    |         5 |              204 |
    |         1 |              205 |
    |         1 |              206 |
    |         5 |              207 |
    |         9 |              208 |
    |         4 |              209 |
    |         1 |              210 |
    |        67 |              212 |
    |        13 |              214 |
    |         1 |              215 |
    |         1 |              216 |
    |         2 |              220 |
    |         2 |              221 |
    |         2 |              230 |
    |         2 |              235 |
    |         1 |              274 |
    |         1 |              290 |
    |         1 |              320 |
    +-----------+------------------+
    

2 个答案:

答案 0 :(得分:0)

将varchar字段定义为大于200个字符。

  

VARCHAR列中的值是可变长度字符串。长度可以指定为MySQL 5.0.3之前的0到255之间的值,5.0.3及更高版本中的0到65,535之间的值。 MySQL 5.0.3及更高版本中VARCHAR的有效最大长度受最大行大小(65,535字节,在所有列之间共享)和使用的字符集的限制。

MySQL manual

了解详情

上述说法的内容是您可以定义长度大于255的varchar列,该表中所有varchar列的大小总和不会超过65,535 更具体地说,您可以修改表格列:

ALTER TABLE xxx CHANGE v1 v1 VARCHAR(500);

答案 1 :(得分:0)

  1. 似乎至少有一些字符串值是多字节的(length()返回以字节为单位的大小,char_length() - 字符大小
  2. SELECT * FROM your_table WHERE LENGTH(v1) != CHAR_LENGTH(v1)
  3. 通常导入/导出脚本应该处理这些事情(假设您的目标服务器支持多字节字符)。您使用什么工具进行出口/进口?据我所知,mysqldump没有这样的问题。