【问题标题】:mysql varchar2 row overflowmysql varchar2 行溢出
【发布时间】:2011-12-11 15:07:31
【问题描述】:

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

  1. 这怎么可能?尝试重新创建它没有成功,有没有人遇到过这种状态?
  2. 如何在不全表扫描整个数据库的情况下找到有问题的行?
  3. 最重要的是,这是否可以修复(同样,使用简单的解决方案,完整的 drop-create 将无济于事)

来自 db(数据被隐藏但真实获取):

描述xxx +----------------+------------------+------+------+ ---------+----------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +----------------+------------------+------+------+ ---------+----------------+ |编号 | int(10) 无符号 |否 |优先级 |空 |自动增量 | |日期 |日期 |否 |穆尔 |空 | | |整数1 | int(10) 无符号 |否 | |空 | | | v1 | varchar(200) |否 | |空 | | | v2 | varchar(200) |否 | |空 | | | i2 | int(10) 无符号 |否 | |空 | | | i3 | int(10) 无符号 |否 | |空 | | | f1 |浮动 |否 | |空 | | | f2 |浮动 |否 | |空 | | +----------------+------------------+------+------+ ---------+----------------+ select count(id) from xxx where length(v1)>200 group by length(v1); +-----------+------+ |计数(id) |长度(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 | +-----------+------+

【问题讨论】:

    标签: mysql varchar


    【解决方案1】:

    将您的 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);
    

    【讨论】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 2014-10-26
        • 2021-08-21
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多