H2 jdbc 异常 - 具有奇数个字符的十六进制字符串

Posted

技术标签:

【中文标题】H2 jdbc 异常 - 具有奇数个字符的十六进制字符串【英文标题】:H2 jdbc exception - Hexadecimal string with odd number of characters 【发布时间】:2019-02-06 15:16:43 【问题描述】:

以下 stmt 适用于 mysql 但不适用于 H2 数据库

插入XXX(内容) 选择 转变(' “文本”:“测试者”, "网址" : "http://hjh.com", “电话” : ”” ', BINARY) 作为内容 来自...

SQL 状态:90003 错误代码:90003 消息:具有奇数个字符的十六进制字符串:“ ""text"" : ""testsee"", ""url"" : ""http://hjh.com"", ““电话”” : ”””” "; SQL 语句: 谁能告诉我如何解决这个问题? 内容列是 blob 类型。 这是一个 Spring Boot 微服务,测试在 H2 上运行。 stmt是用puresql编写的,在启动时由flyway执行。

【问题讨论】:

【参考方案1】:

发生这种情况是因为数据库试图将 Java 字符串转换为 BLOB(字节字符串),将定义为 BLOB 的列类型更改为 VARCHAR(size) 或 TEXT。

您也可以查看此链接https://dev.mysql.com/doc/refman/8.0/en/blob.html

BLOB 是一个二进制大对象,可以保存可变数量的数据。四种 BLOB 类型是 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。这些仅在它们可以保存的值的最大长度上有所不同。四种 TEXT 类型是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。这些对应于四种 BLOB 类型,并且具有相同的最大长度和存储要求。

【讨论】:

我无法将列类型更改为 Varchar。它包含高达 1MB 的数据。这些是纯 sql 脚本: update etui_template SET content = (select convert('"text" : "testsee", "url" : "", "phone" : "", "driverDistraction" : false, "expirationDate" : 0 , "freeTextApplication" : 1', BINARY) as c 我更新了我的答案。请检查它是否对您有帮助。 实际上无法更改列类型.. 我需要找到一种方法在 MYSQL 和 H2 数据库上执行相同的 sql 脚本 因此,您不能在 blob 中保存字符串。 Blob 是为字节字符串设计的。解决问题的一种不优雅的方法是在保存到数据库之前将字符串转换为十六进制。 实际上我正在使用以下方法转换为字节:select convert(' "text" : "testsee", "url" : "hjh.com", "phone" : "" ', BINARY)作为内容

以上是关于H2 jdbc 异常 - 具有奇数个字符的十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 H2 数据库更新 JDBC ResultSet 时出现异常

具有正确 DDL sql 的 H2 org.h2.jdbc.JdbcSQLException:错误代码 = [42000-196]

org.apache.commons.codec.DecoderException:奇数个字符

具有偶数个 a 和奇数个 b 的字符串的正则表达式

org.h2.jdbc.JdbcSQLSyntaxErrorException h2 数据库 java

插入时间戳时的 H2 org.h2.jdbc.JdbcSQLSyntaxErrorException