当我将数字数据简单地插入到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 )
答案 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>