Data too long for column 的真相

16 篇文章 0 订阅

这个错误的原因在于插入或者修改的数据长度超出了数据库某表的某列的设定长度。

例如:表的name长度只有vachar(10),但是你却插入了11个字符,就会报这个错误。

然而,这个错误实际上是中间件-jdbc的报错,数据库是没有这个错误的。

我们来证明一下:

先创建一个表,就只有一个字段id,长度是5

CREATE TABLE `ccc` (
  `id` varchar(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

然后我们分别执行下列语句:

INSERT INTO ccc VALUES("22222")
INSERT INTO ccc VALUES("22222w")

第一条是显示正常存进去。

第二条也是存进去,但是报了一个warning:

Warning Code : 1265
Data truncated for column 'id' at row 1

意思是数据被截断了。

那么查看数据库里,存的确实是5个2,少了一个w.

由此可以得出,插入过长数据,数据库本身并不会出现什么问题,充其量就是截取

当然严谨的来说,我们最好也得测试下插入中文会怎么样?一个英文数字字符代表一个长度,一个中文字符也代表一个长度吗?

INSERT INTO ccc VALUES("啊啊啊啊啊")
INSERT INTO ccc VALUES("啊啊啊啊啊宝宝")

结果和英文的一样,第一个能存,第二个截取报warning。

由此可见,一个中文字符也代表一个长度。(ps:这好像是Mysql5.0之后的事)

 

接下来,我们就脱离数据,使用jdbc再测一次。

使用mybatis插入一个长数据,你就会发现报错:Data too long for column

虽然我没有读过jdbc的源码,但是我大胆推测jdbc-mysql内部行为:如果执行结果出现代号为1265的warning,则回滚到之前的状态,然后报mysql截取异常:com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值