问题
在Java SpringBoot MyBatis 框架的项目中,一切正常,不过在一个接口的参数字段传入过大的数据就会报此错误:
请求常:org.springframework.dao.DataIntegrityViolationException:
Error updating database.Cause:com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation:Data too long for column '’ at row 1
The error may exist in com//server/mapper/.java (best guess)
The error may involve com..server.mapper.****.Inline
The error occurred while setting parameters
此错误的直白翻译就是数据对于数据库的字段来说过长。
解决方式
因为这里使用的MyBatis框架,直接的方式就是修改实体类中属性与数据表中字段的对应关系的注解 @Column。
这里原本代码如下:
@Column(type = MySqlTypeConstant.VARCHAR, length = 100)
可以尝试修改或者去除长度限制“ length = 100”。
但是尝试后其实并没有什么作用。
那么就需要修改这里的类型了。我这里使用的是MYSQL 8.0,我尝试了修改为TEXT类型:
@Column(type = MySqlTypeConstant.TEXT)
TEXT具有长度最大值65,535(即2^16 − 1)个字符。如果有更大的长度需求的话,可以尝试LONGTEXT的类型,最大长度为4,294,967,295 或 4GB (2^32 − 1)个字符。
常用字符串
常用的字符串类型已经整理如下:
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
可变长度字符串。M 表示以字符为单位的最大列长度。这 M 的范围是 0 到 65,535。这 VARCHAR 的有效最大长度受最大行大小(65,535 字节,由所有 columns)和使用的字符集。例如,字符最多可以要求 每个字符三个字节,因此可以使用字符集的 VARCHAR 列声明为 最多 21,844 个字符。
VARCHAR 是CHARACTER VARYING 的简写。NATIONAL VARCHAR 是定义 VARCHAR 列应使用的标准 SQL 方法一些预定义的字符集。MySQL使用这个预定义的字符集。NVARCHAR 是NATIONAL VARCHAR 的简写。
BINARY[(M)]
BINARY 类型类似于 CHAR 类型,但存储 二进制字节字符串,而不是非二进制字符串。 可选长度 M 表示列长度(以字节为单位)。如果省略,则 M 默认为 1。
VARBINARY(M)
VARBINARY 类型类似 到 VARCHAR 类型,但 存储二进制字节字符串而不是非二进制字符 字符串。M 代表最大值列长度(以字节为单位)。
TINYBLOB
具有最大值的 BLOB 列 长度 255 (2,8 − 1) 字节。每个 TINYBLOB 值为 使用 1 字节长度前缀存储,该前缀指示 值中的字节数。
TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
具有最大值的 TEXT 列 长度 255 (2,8 − 1) 字符。有效最大长度较小,如果 value 包含多字节字符。存储每个TINYTEXT 值 使用 1 字节长度前缀来指示 值中的字节。
BLOB[(M)]
具有最大值的 BLOB 列 长度 65,535 (216 − 1) 字节。每个 BLOB 值是 使用 2 字节长度前缀存储,该前缀指示值中的字节数。
可以给出可选的长度 M 对于这种类型。如果完成此操作,MySQL将创建列 最小的 BLOB 类型:大 足以容纳值 M 字节 长。
TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
具有最大值的 TEXT 列 长度 65,535 (216 − 1) 字符。有效最大长度较小,如果 value 包含多字节字符。每个 TEXT值都使用 2 字节长度前缀,表示 值。
可以给出可选的长度 M 对于这种类型。如果完成此操作,MySQL将创建列 最小的 TEXT 类型为 large 足以容纳值 M 个字符。
MEDIUMBLOB
具有最大值的 BLOB 列 长度 16,777,215 (224 − 1) 字节。每个 MEDIUMBLOB 值都使用一个 3字节长度的前缀进行存储,该前缀指示 值中的字节数。
MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
具有最大值的 TEXT 列 长度 16,777,215 (224 − 1)字符。有效最大长度较小,如果 value 包含多字节字符。存储每个 MEDIUMTEXT 值 使用 3 字节长度前缀来指示 值中的字节。
LONGBLOB
具有最大值的 BLOB 列 长度为 4,294,967,295 或 4GB (232 − 1) 字节。这 LONGBLOB列的有效最大长度取决于 客户端/服务器中配置的最大数据包大小 协议和可用内存。存储每个 LONGBLOB 值 使用 4 字节长度前缀来指示值中的字节。
LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
具有最大值的 TEXT 列 长度为 4,294,967,295 或 4GB (232 − 1) 个字符。这 如果值包含多字节字符。LONGTEXT 列的有效最大长度还取决于配置的最大数据包大小 在客户端/服务器协议和可用内存中。每个 LONGTEXT值都使用一个 4 字节长度的前缀进行存储,该前缀表示 值中的字节数。
更多的类型说明可以参照官方的说明文档:https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html