这个错误的原因在于插入或者修改的数据长度超出了数据库某表的某列的设定长度。
例如:表的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