【问题标题】:value too long for type character varying(255) for length 100000对于长度为 100000 的类型字符变化(255)的值太长
【发布时间】: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 输出)

标签: java sql spring postgresql spring-boot


【解决方案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 端解决问题。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2015-09-26
    • 1970-01-01
    • 2019-10-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多