MySQL创建表失败的问题

今天有一个朋友问我一个MySQL的建表问题,问题的现象是创建表失败,根据他的反馈,问题比较奇怪,

CREATE TABLE XXX

..此处省略260多个字段

`xxxxIsAllowIn` varchar(4) COLLATE utf8_bin DEFAULT NULL COMMENT 'xx是否准入(是,否)',

`xxxxIsAllowIn` varchar(30) COLLATE utf8_bin DEFAULT NULL COMMENT '理财-准入',

PRIMARY KEY (`SERIALNO`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='???????”3èˉ·?????ˉ';

是的,你没有看错,还有乱码,根据朋友反馈的现象是在生产环境可以创建成功,但是测试环境创建失败。

报错信息为:

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

我把文本拷贝到本地,想复现,结果因为乱码直接执行失败,对于这种情况,还是同事帮我做了下问题过滤,采用如下的方式即可把注释删除。

cat a.sql |sed 's/COMMENT'.*'/,/g'

所以省事了不少,我就来继续分析这个问题。一般来说这个错误看起来是单行的数据超出限制了,因为MySQL里面每行的数据有一个65535的限制,想必是这个原因吧。

但是朋友反馈是没有超出这个限制的,根据里面的字符类型做计算,发现确实没有达到65535.

所以这个问题就微妙起来,我们来说说几种解决方式。

解决方式1:

修改存储引擎,设置为myisam

...

KEY `idx_customerName` (`CUSTOMERNAME`)

) ENGINE=myisam DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

"c.sql" 276L, 16070C written

mysql> source c.sql

Query OK, 0 rows affected (0.07 sec)

MyISAM有3种行存储格式:fixed/dynamic/compressed,InnoDB在这个基础上增加了Barracuda的格式。

5.7中的默认参数设置如下:

mysql> show variables like '%format';

+---------------------------+-------------------+

| Variable_name | Value |

+---------------------------+-------------------+

| binlog_format | ROW |

| date_format | %Y-%m-%d |

| datetime_format | %Y-%m-%d %H:%i:%s |

| default_week_format | 0 |

| innodb_default_row_format | dynamic |

| innodb_file_format | Barracuda |

| time_format | %H:%i:%s |

+---------------------------+-------------------+

7 rows in set (0.00 sec)

所以现在的问题差异就在于MyISAM和InnoDB。

共享表空间的格式为Antelope,在5.5中默认就是这个格式。

解决方式2;

这个问题我做了一些测试。对比了字符集,row_format的设置。

) ENGINE=innodb row_format=dynamic DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

"c.sql" 276L, 16090C written

mysql> source c.sql

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB p

) ENGINE=innodb row_format=compact DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

"c.sql" 276L, 16090C written

mysql> source c.sql

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

) ENGINE=innodb DEFAULT CHARSET=latin1;

"c.sql" 276L, 16056C written

mysql> source c.sql

ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

得到的一个初步结论就是先设置innodb_strict_mode为off,默认5.7是开启的,当然从MySQL5.5版本开始,可以开启InnoDB严格检查模式,如果采用了页数据压缩功能后,建议是开启该功能。在创建表,更改表和创建索引时,如果写法有错误,不会有警告信息,而是直接抛出错误,这样就可直接将问题扼杀在摇篮里。

当然这个里的这个问题现象确实比较纠结。

解决方法3:

从表结构设计入手,尽可能拆分这个表的逻辑,把它拆分为多个表。一个表的字段数尽可能不要太多。数据库、表数量尽可能少;数据库一般不超过50个,每个数据库下,数据表数量一般不超过500个(包括分区表);可以很明显看出这个表的设计就是根据业务的需求开始垂直扩展,其实可以拆分出一个逻辑表,逻辑数据很容易持续扩展,而不是在字段层面来不断扩展。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-2146961/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-2146961/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kettle 是一款功能强大的ETL工具,可以用于数据的抽取、转换和加载。在进行批量建的过程中,可以通过kettle 来实现。 首先,我们需要准备好建所需的元数据信息,包括名、字段名、字段类型、字段长度等。可以使用kettle 提供的元数据输入组件,例如Excel文件输入或数据库输入,将元数据信息导入到kettle 中。 在kettle 中,可以使用“Table Output”组件来实现批量建的操作。首先,创建一个新的转换,在转换中拖拽并连接上元数据输入组件和“Table Output”组件。 在“Table Output”组件中,我们可以选择要连接的目标数据库,如MySQL、Oracle等,并选择要建的数据库和名。然后,我们可以通过设置组件属性来指定的字段名、字段类型和约束信息等。在组件属性中,我们可以将元数据输入组件中读取到的字段信息映射到建语句中的对应位置。 接下来,我们可以执行这个转换,kettle 会根据元数据信息生成相应的建语句,然后将其发送到目标数据库中执行,从而实现批量建的操作。 在建过程中,如果有需要的话,我们也可以添加一些特定的操作,如添加索引、设置主键等。 总的来说,通过使用kettle 提供的元数据输入和“Table Output”组件,在配置好相应的属性后,就可以方便而快速地实现批量建的操作。这样可以节省大量人工创建的时间,提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值