使用AWS DMS-Varchar字段从DB2到PostgreSQL的数据迁移显示尾随空格

使用AWS DMS-Varchar字段从DB2到PostgreSQL的数据迁移显示尾随空格,postgresql,db2,varchar,spaces,trailing,Postgresql,Db2,Varchar,Spaces,Trailing,我们正在使用AWS DMS将DB2数据迁移到PostgreSQL 11.x,在DB2中有带尾随空格的varchar字段,在WHERE子句中使用这些字段时,这些字段没有任何修剪,工作正常。我认为DB2会对它们进行内部修剪,因为它们是varchar字段。但是在移动到PostgreSQL之后,这些字段在没有修剪的情况下无法工作,并且有时即使使用修剪,也会产生意外的结果。下面是详细的问题 来源:DB2-RECIP_NUM--VARCHAR(10)--'ST001' select RECIP_NUMBER

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

来源: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 
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
输出:

目标:PGSQL--
RECIP\u 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 
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
输出:


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

Postgres不遵循SQL标准,在比较
VARCHAR
TEXT
字符串时,要求填充较短的字符串;它只填充
CHAR
字符串。因此,您可以使用
…WHERE SERV_TYPE::char='ST001'::char
来模拟Db2行为。请注意,虽然这将排除在
SERV\u TYPE
上使用索引,严格来说,这与使用
trim(SERV\u TYPE)

时一样,但我认为关于SQL标准的评论是不正确的(不再是?)。2011年标准规定“两个字符串表达式的比较取决于用于比较的排序规则”。这意味着行为的变化取决于排序规则是使用PAD还是不使用PAD特征。即,对于无焊盘,“[如果]较短值等于较长值的某个前缀,则认为较短值小于较长值”。对于PAD,“通过在右侧串联空格,较短的值有效地扩展到较长值的长度。”