【问题标题】:Spring Boot + JPA[Hibernate backed] + mysql = Data truncation: Data too long for column 'ATTRIBUTE_NAME' at row 1Spring Boot + JPA [Hibernate backed] + mysql = Data truncation: Data too long for column 'ATTRIBUTE_NAME' at row 1
【发布时间】:2019-07-01 07:12:15
【问题描述】:

尝试对 mysql 数据库运行插入语句时发生错误。我已经为休眠打开了 sql args 跟踪,以查看操作转换为查询以及绑定的确切内容。

在 mysql 数据库中,列 ATTRIBUTE_NAME 是 VARCHAR(200)...查看跟踪的日志,我看到字符串是 79 个字符(“org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN”)。

以下是日志 - 请指出正确的方向,因为这确实让我很困惑。查找“SQL 错误:1406,SQLState:22001”并在此之前读取条目。

    The attr: org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN
 and the length: 79
The attr: SPRING_SECURITY_CONTEXT
 and the length: 23
2019-02-07 09:07:50.761 DEBUG 18764 --- [nio-8998-exec-8] org.hibernate.SQL                        : select CODE_NAMEse0_.id as id1_16_, CODE_NAMEse0_.EXPIRY_DATE as EXPIRY_D2_16_, CODE_NAMEse0_.INACTIVE_INTERVAL_MIN as INACTIVE3_16_, CODE_NAMEse0_.SESSION_TYPE as SESSION_4_16_, CODE_NAMEse0_.SESSION_ID as SESSION_5_16_, CODE_NAMEse0_.START_DATE as START_DA6_16_, CODE_NAMEse0_.username as username7_16_ from CODE_NAME_SESSION CODE_NAMEse0_ where CODE_NAMEse0_.username=?
2019-02-07 09:07:50.761 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [0835623872]
2019-02-07 09:07:50.770 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_16_] : [BIGINT]) - [474]
2019-02-07 09:07:50.770 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([EXPIRY_D2_16_] : [TIMESTAMP]) - [2019-02-07 09:11:40.0]
2019-02-07 09:07:50.770 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([INACTIVE3_16_] : [BIGINT]) - [5]
2019-02-07 09:07:50.771 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([SESSION_5_16_] : [VARCHAR]) - [67898350-7858-4de1-8e45-e6545768b875]
2019-02-07 09:07:50.771 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([START_DA6_16_] : [TIMESTAMP]) - [2019-02-07 09:06:40.0]
2019-02-07 09:07:50.771 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([username7_16_] : [VARCHAR]) - [0835623872]
2019-02-07 09:07:50.771 DEBUG 18764 --- [nio-8998-exec-8] org.hibernate.SQL                        : select CODE_NAMEse0_.CODE_NAME_SESSION_ID as CODE_NAME4_17_0_, CODE_NAMEse0_.id as id1_17_0_, CODE_NAMEse0_.id as id1_17_1_, CODE_NAMEse0_.ATTRIBUTE_NAME as ATTRIBUT2_17_1_, CODE_NAMEse0_.ATTRIBUTE_VALUE as ATTRIBUT3_17_1_, CODE_NAMEse0_.CODE_NAME_SESSION_ID as CODE_NAME4_17_1_ from CODE_NAME_SESSION_ATTRIBUTE CODE_NAMEse0_ where CODE_NAMEse0_.CODE_NAME_SESSION_ID=?
2019-02-07 09:07:50.771 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [474]
2019-02-07 09:07:50.773 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_17_1_] : [BIGINT]) - [1410]
2019-02-07 09:07:50.774 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([ATTRIBUT2_17_1_] : [VARCHAR]) - [SPRING_SECURITY_CONTEXT]
2019-02-07 09:07:50.776 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([ATTRIBUT3_17_1_] : [VARBINARY]) - [org.springframework.security.core.context.SecurityContextImpl@2ec961af: Authentication: za.co.intellimali.CODE_NAME.security.AuthenticationToken@2ec961af: Principal: za.co.intellimali.CODE_NAME.domain.CODE_NAMESession@7552b3f3; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_MEAL, ROLE_ACCOM, ROLE_STU, MEMBER]
2019-02-07 09:07:50.776 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([CODE_NAME4_17_1_] : [BIGINT]) - [474]
2019-02-07 09:07:50.776 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([CODE_NAME4_17_0_] : [BIGINT]) - [474]
2019-02-07 09:07:50.777 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_17_0_] : [BIGINT]) - [1410]
2019-02-07 09:07:50.780 DEBUG 18764 --- [nio-8998-exec-8] org.hibernate.SQL                        : insert into CODE_NAME_SESSION_ATTRIBUTE (ATTRIBUTE_NAME, ATTRIBUTE_VALUE, CODE_NAME_SESSION_ID) values (?, ?, ?)
2019-02-07 09:07:50.780 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN]
2019-02-07 09:07:50.780 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARBINARY] - [org.springframework.security.web.csrf.DefaultCsrfToken@6f0adee5]
2019-02-07 09:07:50.780 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [BIGINT] - [474]
2019-02-07 09:07:50.791  WARN 18764 --- [nio-8998-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1406, SQLState: 22001
2019-02-07 09:07:50.792 ERROR 18764 --- [nio-8998-exec-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : Data truncation: Data too long for column 'ATTRIBUTE_NAME' at row 1
2019-02-07 09:07:50.805 DEBUG 18764 --- [nio-8998-exec-8] org.hibernate.SQL                        : select CODE_NAMEse0_.id as id1_16_, CODE_NAMEse0_.EXPIRY_DATE as EXPIRY_D2_16_, CODE_NAMEse0_.INACTIVE_INTERVAL_MIN as INACTIVE3_16_, CODE_NAMEse0_.SESSION_TYPE as SESSION_4_16_, CODE_NAMEse0_.SESSION_ID as SESSION_5_16_, CODE_NAMEse0_.START_DATE as START_DA6_16_, CODE_NAMEse0_.username as username7_16_ from CODE_NAME_SESSION CODE_NAMEse0_ where CODE_NAMEse0_.SESSION_ID=?
2019-02-07 09:07:50.806 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [67898350-7858-4de1-8e45-e6545768b875]
2019-02-07 09:07:50.807 TRACE 18764 --- [nio-8998-exec-8] o.h.type.descriptor.sql.BasicExtractor   : extracted value ([id1_16_] : [BIGINT]) - [474]

表:

java端有问题的变量:

@Column(name = "ATTRIBUTE_NAME")
private String attributeName;

我必须遗漏一些明显的东西......

编辑:我从 wireshark 中得到的东西

    insert into CODE_NAME_SESSION_ATTRIBUTE (ATTRIBUTE_NAME, ATTRIBUTE_VALUE, CODE_NAME_SESSION_ID) 
values 
(
    'org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.CSRF_TOKEN'
    , _binary'..\0.sr\06org.springframework.security.web.csrf.DefaultCsrfTokenZ.../....\0.L\0\nheaderNamet\0.Ljava/lang/String;L\0\rparameterNameq\0~\0.L\0.tokenq\0~\0.xpt\0.X-CSRF-TOKENt\0._csrft\0$04735f03-57cf-4984-860c-e8e03400d432'
    , 474);
    ....~.#22001Data too long for column 'ATTRIBUTE_NAME' at row 1  ....rollback................SET autocommit=1................SET autocommit=0................commit................SET autocommit=1................SET autocommit=0................select CODE_NAMEse0_.id as id1_16_, CODE_NAMEse0_.EXPIRY_DATE as EXPIRY_D2_16_, CODE_NAMEse0_.INACTIVE_INTERVAL_MIN as INACTIVE3_16_, CODE_NAMEse0_.SESSION_TYPE as SESSION_4_16_, CODE_NAMEse0_.SESSION_ID as SESSION_5_16_, CODE_NAMEse0_.START_DATE as START_DA6_16_, CODE_NAMEse0_.username as username7_16_ from CODE_NAME_SESSION CODE_NAMEse0_ where CODE_NAMEse0_.SESSION_ID='36c6cb34-aa46-4821-b3a4-15e80c7c57fa'

上述在mysql工作台中运行时会出现警告并将ATTRIBUTE_NAME截断为'org.springframework.security.web.csrf.HttpSessionC'

如果我跑:

    insert into CODE_NAME_SESSION_ATTRIBUTE (ATTRIBUTE_NAME, ATTRIBUTE_VALUE, CODE_NAME_SESSION_ID) 
values 
(
    'CSRF_TOKEN'
    , _binary'..\0.sr\06org.springframework.security.web.csrf.DefaultCsrfTokenZ.../....\0.L\0\nheaderNamet\0.Ljava/lang/String;L\0\rparameterNameq\0~\0.L\0.tokenq\0~\0.xpt\0.X-CSRF-TOKENt\0._csrft\0$04735f03-57cf-4984-860c-e8e03400d432'
    , 474);

在没有警告的情况下工作,表明该表没有为 ATTRIBUTE_NAME 占用更大的长度。我觉得这是一个mysql问题,而不是java + spring + jpa

【问题讨论】:

  • 能分享一下在数据库中插入数据的代码吗
  • entitymanager.persist()
  • 和 entityManager.merge() 在处理因序列化而分离时
  • 粘贴实际异常,粘贴设置并保留代码。
  • 在 SQL 控制台中运行 SHOW CREATE TABLE youtTableName 并粘贴输出。您是否在 sql workbench 中更改了 varchar 限制并忘记应用更改?

标签: mysql hibernate spring-data-jpa


【解决方案1】:

Antoniosss 的查询:SHOW CREATE TABLE youtTableName

这导致了我的问题。原因如下:

最初使用 spring session 时使用了他们的脚本,该脚本创建了一个名为 SPRING_SESSION_ATTRIBUTE 的表...现在我们更改了此表以添加更多功能和名称,但在 dev 上我们仍然拥有它作为副本(应该删除它)。出于习惯,我更改了那里的值并在我想更改的表根本不是那个表而是我们的自定义表时提交了

【讨论】:

  • 会将此标记为答案,因为 Antoniosss 删除了他的帖子,因此无法标记。
猜你喜欢
  • 2019-07-28
  • 2020-09-15
  • 2020-12-06
  • 2014-08-10
  • 2020-06-27
  • 2018-05-16
  • 2016-03-28
  • 2021-04-03
  • 2017-07-17
相关资源
最近更新 更多