Teradata SQL VARCHAR 和空格

Teradata SQL VARCHAR and spaces

当我将数字数据简单地插入到 varchar 中时,我不太理解 字段为什么用 2 spaces 左填充它。 varchar 不应该 trim 关闭 spaces(尾随好...但是你 "frontpad" 与 spaces 的规则在哪里)。为什么然后用 2 个前导 spaces

填充
INSERT INTO v VALUES  ( ,1243444,3455435,8768810,'fdff',5,7,8,,)

这里( ,1243444,3455435,8768810,'fdff',5,7,8,,)(someirrelvant_datatype,varchar(x),varchar(y),varchar(z),char(5),smallint,int,int,Timestamp)

所以数据看起来像这样

SEL     CHAR2HEXINT  ( colA ) ,colA FROM v


313732353732    172572  /* this is some other pre-existing value*/ 
2020202033343535343335      3455435  /* this is value just inserted */

所以如果你看到上面 20202020 十六进制 2 spaces aka ' '

第二题(不是上述情况的延续)
我也有像这样的 varchar (50) col 的数据

HMSA
232434343
HMSA
4343434343
434343434

这里的 HMSA 有尾随 space 2020 HEX 但其他值没有 trailing spaces。不确定发生了什么。现在 varchar 不应该丢弃所有尾随的 space 吗?数据如何登陆 HMSA<space> 不确定 。有什么想法吗?

好的,让我们看看由此产生的一些奇怪之处:

insert ( 'yada    ') into tb /* tb is volatile &  SET.There are 4 spaces */
insert ( 'yada') into tb 

Query Failed. 2802:  Duplicate row error in tb

好的,看看这是什么样子的

7961646120202020 yada  /*There are 4 spaces  - 20 x 4 */

所以在第 2 次插入时它放弃了 space 比较部分并做了 trim(oldvalue) vs trim ( new value )

Q1:当你 运行 a SELECT FORMAT(3455435), TYPE(3455435) 你得到 -(10)9 INTEGER

每种数据类型总是有一个 Cobol 风格的格式,用于与字符串进行转换。在您的情况下,源和目标的数据类型不匹配,Teradata 进行了自动类型转换。整数的格式最多为十位数字加上一个前导符号 右对齐.

使用标准的显式类型转换 SQL CAST 不应用格式,因此不应用前导空格。因此,只需执行 CAST(3455435 AS VARCHAR(20) 或 (TRIM(3455435)` 即可。

Q2:VarChar 会准确存储您插入的内容,即 '1234 ' 将存储包括两个空格。并且基于标准 SQL 比较规则,在比较字符串时忽略尾随空格,因此 'yada ''yada' 被认为是相等的(您可能之前使用过不遵循标准 [=28 的 Oracle =] 在这种情况下)。