对于长度为 100000 的类型字符变化(255)的值太长
Posted
技术标签:
【中文标题】对于长度为 100000 的类型字符变化(255)的值太长【英文标题】:value too long for type character varying(255) for length 100000 【发布时间】:2021-10-20 07:46:27 【问题描述】:我正在使用 Spring Data JPA,我的列定义是
@Column(length = 100000)
private String description;
在有效负载中,我使用的是字符数为20000
的描述。但它仍然在抛出
错误:类型字符变化的值太长(255)`
如果100000
不足以容纳长度为20000
的字符,varying(255)
的错误如何呢?但是在物理数据库表中我可以在表定义中看到character varying(100000)
。
即使 Text Type
仅使用 length 1990
的文本也会出现相同的错误
2021-08-23 17:48:24.727 WARN 21044 --- [nio-8089-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 22001
2021-08-23 17:48:24.727 ERROR 21044 --- [nio-8089-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: value too long for type character varying(255)
2021-08-23 17:48:24.733 ERROR 21044 --- [nio-8089-exec-3] org.hibernate.AssertionFailure : HHH000099: an assertion failure occurred
【问题讨论】:
如果您可以看到要定义为varchar(10000)
的列并且您从 Java 代码中收到错误消息,那么您的 Java 代码正在连接到该列具有不同定义的不同数据库。
@a_horse_with_no_name 情况并非如此,因为它在text
上工作,但因为100000
对我来说已经足够了,我有兴趣使用这个。
varchar(10000)
比 text
没有性能或存储优势。但是,如果 Postgres 抱怨长度,那么我倾向于相信 Postgres 该列被定义为 varchar(255)
- 错误消息非常明显,您试图在以该最大值定义的列中存储超过 255 个字符。
@a_horse_with_no_name 不仅是存储优势,而且我需要更改我的 java 代码以从数据库中取回数据,即我不想要的反序列化,varchar(255)
是我期待太久的默认值对于类型varchar(100000)
请将错误显示在 postgresql 日志中,包括所有 cmets 等,以及表定义(或 psql \dt 输出)
【参考方案1】:
问题出在数据库上,因为据我所知,PostgreSQL db 中的 varchar 列接受 255 个字符,将字符变化或字符列更改为文本列类型 (从 Postgres 9.2 开始,有时最初不使用文本)
ALTER TABLE your_table ALTER COLUMN description TYPE text;
【讨论】:
问题是关于 Postgres 而不是 mysql。要么将您的答案更改为相关的答案,要么将其删除。 是的,对不起,我没有注意,但在这种情况下,它与 postgresql 相同,也使用 255 不,这也不是真的。在 Postgres 中varchar
没有长度说明符等于 text
并且存储的字符串最大可以达到 ~1GB 大小。例如:create table varchar_test(var_fld varchar(1000)); var_fld | character varying(1000)
.
从 Postgres 9.2 开始,有时最初不使用文本【参考方案2】:
当然,您的 java 代码运行一个 sql 语句,其中 varchar(255) 列被过度更新,字符串长度超过 255。
也许你使用 Hibernate Envers 也许桌子上有一些触发功能 也许你连接了其他数据库 也许是其他人先用值记录sql语句。
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
https://www.baeldung.com/sql-logging-spring-boot
您可以将 sql 语句运行到您的数据库。
如果比你连接其他数据库有效 如果没有,那么您可以在 db 端解决问题。【讨论】:
以上是关于对于长度为 100000 的类型字符变化(255)的值太长的主要内容,如果未能解决你的问题,请参考以下文章