对于长度为 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)的值太长的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql varchar类型的长度

Mysql基本类型(字符串类型)——mysql之二

excel 导入 sqlserver 字符串被截取为255长度解决方案

MySQL学习记录02常用数据类型

MySQL 数据类型

关于SQL Server 2000 Varchar长度的一个问题!!请高手解答