数据太长列的错误

如果一列超过4000个字符是太大的默认数据类型并返回一个错误。

写的亚当Pavlacka

去年发表在:2022年5月16日

问题

你想插入一个表结构,但你会得到一个java.sql。SQLException异常:数据太长列错误。

引起的:java.sql。SQLException异常:数据太长列“TYPE_NAME”在第一行查询的方法是:插入COLUMNS_V2 (CD_ID,评论,“COLUMN_NAME”、TYPE_NAME INTEGER_IDX)值(?,?,?,?,?),参数(103182年,《零》,“地址”,“结构< street_address1: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address2: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address3: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address4: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address5: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address6: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address7: struct < street_number: int, street_name:字符串,street_type:字符串,国家:字符串,postal_code: string >, street_address8: struct < street_number: int, street_name:字符串,street_type:字符串,清纯甜美……在org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery (LogQueryTool.java: 153) (AbstractQueryProtocol.java: 255) org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternalBatch (MariaDbPreparedStatementClient.java: 368) org.mariadb.jdbc.MariaDbPreparedStatementClient.executeBatch (MariaDbPreparedStatementClient.java: 280)

导致

这个问题的根源是一个默认的数据类型varchar (4000)列在你的桌子上。

如果你有一个深层嵌套的结构体长度超过4000多个字符,它超过大小的默认数据类型和结果在一个错误消息。

你可以验证这个通过描述列你正试图将数据插入。它将返回的数据类型varchar (4000)

解决方案

您应该使用一个外部metastore如果你要超过4000个字符在一个列。的默认数据类型数据砖蜂巢metastorevarchar (4000),不能更改。

当你使用一个外部metastore,完全控制列和数据库名称的长度。你也有控制排序的列的名称,数据库名和表名。

检查外部Apache蜂巢metastore (AWS|Azure|GCP)文档以了解如何设置外部metastore。

一旦创建了metastore表,您就可以直接修改列数据类型使用ALTER TABLE命令。

这篇文章有用吗?