Teradata SQL VARCHAR和空格

时间:2016-08-29 22:31:31

标签: sql database teradata varchar sqldatatypes

当我将数字数据简单地插入到varchar中时,我并不完全遵循 为什么它左边用2个空格填充它。是不是varchar应该修剪空格(尾随确定......但是你的规则在哪里" frontpad"有空格)。为什么然后用2个前导空格填充

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 ' '十六进制

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

HMSA
232434343
HMSA
4343434343
434343434

此处HMSA的尾随空格为2020 HEX,但其他值没有trailing spaces。不知道最近发生了什么。现在这里是不是varchar应该扔掉所有尾随空格?数据如何与HMSA<space>一起降落 不确定 。有什么想法吗?

好的,让我们看看由此产生的一些奇怪之处:<​​br/>

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 */

所以在第二个插入时,它抛弃了空间比较部分并做了trim(oldvalue) vs trim ( new value )

1 个答案:

答案 0 :(得分:4)

Q1:当您运行SELECT FORMAT(3455435), TYPE(3455435)时,您会-(10)9 INTEGER

每种数据类型都始终采用Cobol样式格式,用于在字符串之间进行强制转换。在您的情况下,源和目标的数据类型不匹配,Teradata执行自动类型转换。整数的格式最多为十位数加上一个前导符号 right aligend

使用标准SQL CAST的Explixit类型转换不应用任何格式,因此不会使用前导空格。所以只需改为CAST(3455435 AS VARCHAR(20)或(TRIM(3455435)`。

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