【问题标题】:Data Migration from DB2 to PostgreSQL using AWS DMS - Varchar fields are showing trailing spaces使用 AWS DMS 将数据从 DB2 迁移到 PostgreSQL - Varchar 字段显示尾随空格
【发布时间】:2021-04-06 15:17:16
【问题描述】:

我们正在使用 AWS DMS 将 DB2 数据迁移到 PostgreSQL 11.x,我们在 db2 中有带有尾随空格的 varchar 字段,并且没有任何 TRIM,当我们在 WHERE 子句中使用这些字段时,这些字段可以正常工作。我认为 DB2 在内部修剪它们,因为这些是 varchar 字段。但是在迁移到 PostgreSQL 之后,这些字段在没有 TRIM 的情况下无法工作,而且有时即使您使用 TRIM,这些字段也会产生意想不到的结果。下面是详细的问题。

来源:DB2 - RECIP_NUM -- VARCHAR(10) -- 'ST001 '

select RECIP_NUMBER, SERV_TYPE, LENGTH(SERV_TYPE) AS before_trim_COL_LENGTH, LENGTH(trim(SERV_TYPE)) AS after_trim_COL_LENGTH
from serv_type rst
WHERE SERV_TYPE = 'ST001' -- THIS WORKS FINE WITHOUT TRIM 

输出:Output of DB2

目标:PGSQL——RECIP_NUM——VARCHAR(10)——'ST001 '

select RECIP_NUMBER, SERV_TYPE, LENGTH(SERV_TYPE) AS COL_LENGTH 
from serv_type rst
WHERE trim(SERV_TYPE) = 'ST001' -- THIS IS NOT GIVING ANY OUTPUT WITHOUT TRIM

输出:Output of PostgreSQL

有什么方法可以告诉 PostgreSQL 忽略 VARCHAR 列的尾随空格?

【问题讨论】:

    标签: postgresql db2 varchar spaces trailing


    【解决方案1】:

    Postgres 不遵循 SQL 标准,在比较 VARCHARTEXT 字符串时需要填充较短的字符串;它只填充CHAR 字符串。因此,您可以使用...WHERE SERV_TYPE::char = 'ST001'::char 来模拟 Db2 行为。请注意,这将排除在SERV_TYPE 上使用索引,与使用trim(SERV_TYPE) 时相同。

    【讨论】:

    • 严格来说,我不认为关于 SQL 标准的评论是正确的(现在?)。 2011 标准说“两个字符串表达式的比较取决于用于比较的排序规则”。这意味着行为会根据您的排序规则是使用 PAD 还是 NO PAD 特性而改变。 IE。对于 NO PAD,“[如果] 较短的值等于较长值的某个前缀,则较短的值被认为小于较长的值”。对于 PAD,“通过在右侧连接空格,将较短的值有效地扩展到较长的长度。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2018-09-19
    • 2018-07-24
    • 2021-06-17
    • 2021-07-06
    相关资源
    最近更新 更多