postgresql 错误:类型字符变化的值太长(256)

Posted

技术标签:

【中文标题】postgresql 错误:类型字符变化的值太长(256)【英文标题】:postgresql erro: value too long for type character varying(256) 【发布时间】:2020-10-14 19:25:42 【问题描述】:

我之前研究过其他解决方案,但无法从解释中找出问题所在。我正在尝试运行一个 python 脚本,其中数据从 oltp mysql 数据库 (AWS RDS) 加载到 AWS Redshift 上的 olap 数据库。我在 Redshift 中定义了我的表,如下所示:

create_product = ("""CREATE TABLE IF NOT EXISTS product (
    productCode varchar(15) NOT NULL PRIMARY KEY,
    productName varchar(70) NOT NULL,
    productLine varchar(50) NOT NULL,
    productScale varchar(10) NOT NULL,
    productVendor varchar(50) NOT NULL,
    productDescription text NOT NULL,
    buyPrice decimal(10,2) NOT NULL,
    MSRP decimal(10,2) NOT NULL
    )""")

我正在使用 python 脚本将数据从 RDS 加载到 Redshift。我要加载的函数体


    for query in dimension_etl_query:
        oltp_cur.execute(query[0])
        items = oltp_cur.fetchall()
        try:
            olap_cur.executemany(query[1], items)
            olap_cnx.commit()
            logger.info("Inserted data with: %s", query[1])
        except sqlconnector.Error as err:
            logger.error('Error %s Couldnt run query %s', err, query[1])

脚本运行抛出错误

olap_cur.executemany(查询[1],项目) psycopg2.errors.StringDataRightTruncation:对于类型字符变化的值太长(256) 我已经在我的 SQL 数据库中检查了每个列的长度,并且只有 productDescription 的长度大于 265 个字符。但是,我在 postgres 中为该列使用文本数据类型。希望有任何关于如何找到根本原因的提示?

【问题讨论】:

【参考方案1】:

看这里:

https://docs.aws.amazon.com/redshift/latest/dg/r_Character_types.html#r_Character_types-text-and-bpchar-types

TEXT 和 BPCHAR 类型

您可以创建包含 TEXT 列的 Amazon Redshift 表,但它会转换为 VARCHAR(256) 列,该列接受最多 256 个字符的可变长度值。

您可以创建具有 BPCHAR(空白填充字符)类型的 Amazon Redshift 列,Amazon Redshift 将其转换为固定长度的 CHAR(256) 列。

看起来你可能需要VARCHAR,我想。来自同一链接:

VARCHAR 或 CHARACTER VARYING ...

如果在表达式中使用,则输出的大小由输入表达式确定(最大为 65535)。

您必须进行试验,看看这是否有效。

【讨论】:

你说得对,我已将 TEXT 更改为 VARCHAR(500)。我认为这是 Redshift 与 Postgresql 的偏差。 在 Postgres 中,text 是一个无限长度的varchar【参考方案2】:

尽量将所有内容保持在 256 个字符以下,即使是 text

【讨论】:

据我了解,文本长度不限。 我只是想为他保持简单:)

以上是关于postgresql 错误:类型字符变化的值太长(256)的主要内容,如果未能解决你的问题,请参考以下文章

DatabaseError:类型字符变化的值太长(100)

对于长度为 100000 的类型字符变化(255)的值太长

Django psycopg2.errors.StringDataRightTruncation:对于类型字符变化的值太长(200)

Python Django psycopg2.errors.StringDataRightTruncation:类型字符的值太长

尽管我的字符串在范围内,但类型字符变量(x)的值太长

SQL 查询返回“值太长”