为啥这个值对于我的 H2 表来说太长了

Posted

技术标签:

【中文标题】为啥这个值对于我的 H2 表来说太长了【英文标题】:Why is this value too long for my H2 table为什么这个值对于我的 H2 表来说太长了 【发布时间】:2014-08-04 13:05:47 【问题描述】:

我有一个使用 H2 进行存储的 spring-data-jpa 应用程序。当我尝试将一些数据解析到表中时,出现错误:

 o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 22001, SQLState: 22001
2014-06-13 15:42:07.062 ERROR 66742 --- [nio-9001-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Value too long for column "REMARKS VARCHAR(255)": "'""DOB 31 Jan 1939; Cedula No. 6068015 (Colombia); alt. Cedula No. 6067015 (Colombia); Passport T321642 (Colombia); alt. Passport... (259)"; SQL statement:
insert into sdn (call_sign, grt, program, remarks, sdn_num, sdn_type, title, tonnage, vess_flag, vess_owner, vess_type, ent_num) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-172]

我有一个表定义为:

CREATE TABLE IF NOT EXISTS Sdn (
  entNum    BIGINT (11) NOT NULL,
  sdnName   VARCHAR(700)  NULL,
  sdnType   VARCHAR(24)   NULL,
  program   VARCHAR(100)  NULL,
  title     VARCHAR(4000) NULL,
  callSign  VARCHAR(20)   NULL,
  vessType  VARCHAR(50)   NULL,
  tonnage   VARCHAR(30)   NULL,
  grt       VARCHAR(20)   NULL,
  vessFlag  VARCHAR(80)   NULL,
  vessOwner VARCHAR(300)  NULL,
  remarks   CLOB          NULL,
  UNIQUE KEY entityNum(entNum)
);

我的@Entity 类为:

@Entity
public class Sdn 

    @Id
    private long entNum;
    private String sdnName;
    private String sdnType;
    private String program;
    private String title;
    private String callSign;
    private String vessType;
    private String tonnage;
    private String grt;
    private String vessFlag;
    private String vessOwner;
    private String remarks;

这是违规记录,显然小到可以放入列中:

"DOB 31 Jan 1939; Cedula No. 9876543 (cccccccc); alt. Cedula No. 6067015 (cccccccc); Passport T123456 (cccccccc); alt. Passport 1234567 (Comoros); alt. Passport 12345 (Argentina); alt. Passport 87654321 (ppppppppp); a.k.a. 'THE TTTT PLAYER'; a.k.a. 'NAME1'."

我能想到的只是分号或其他一些无效字符引发了这个异常。

任何人都可以在这里看到问题,并提出解决问题的替代方法吗?

【问题讨论】:

strlen() 您的字符串(包括开头/结尾处的 ")显示它的长度为 258 个字符。所以,是的,DB 是对的,而您正在将大象推入老鼠洞。 【参考方案1】:

您声明的表定义:

CREATE TABLE IF NOT EXISTS Sdn (
  entNum    BIGINT (11) NOT NULL,
  sdnName   VARCHAR(700)  NULL,
  sdnType   VARCHAR(24)   NULL,
  program   VARCHAR(100)  NULL,
  title     VARCHAR(4000) NULL,
  callSign  VARCHAR(20)   NULL,
  vessType  VARCHAR(50)   NULL,
  tonnage   VARCHAR(30)   NULL,
  grt       VARCHAR(20)   NULL,
  vessFlag  VARCHAR(80)   NULL,
  vessOwner VARCHAR(300)  NULL,
  remarks   CLOB          NULL,
  UNIQUE KEY entityNum(entNum)
);

不同意错误信息,说备注栏是VARCHAR(255)而不是CLOB

而且您的值确实超过了 255 个字符的限制。

您可能需要更改表格以匹配您的想法。

您的实体似乎没有定义列类型的 JPA 或 Hibernate 注释。您可能还需要在 remarks 字段上添加注释,将其标识为 CLOB

【讨论】:

谢谢,我将我的实体更改为映射为“@Column(name="remarks") @Lob private String notes;”,这就成功了。关于 255 的错误代码让我很反感,所以我只是忽略了它并使用我的注释来明确。 我必须添加什么注释来定义该字段定义图像? 谢谢。在实体字段上添加@Lob 修复了问题

以上是关于为啥这个值对于我的 H2 表来说太长了的主要内容,如果未能解决你的问题,请参考以下文章

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定

无法创建 NVARCHAR2 > 2000

free():无效的下一个大小(快)字符串太长了? [重复]

根据屏幕宽度修剪单词

超链接可以多长?

好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个