use*_*594 2 sql database varchar teradata sqldatatypes
当我将数字数据简单地插入 varchar 字段时,我不太明白为什么它用 2 个空格左填充它。varchar 不应该修剪空格(尾随确定......但是你用空格“frontpad”的规则在哪里)。为什么然后用 2 个前导空格填充
INSERT INTO v VALUES ( ,1243444,3455435,8768810,'fdff',5,7,8,,)
Run Code Online (Sandbox Code Playgroud)
这里( ,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 */
Run Code Online (Sandbox Code Playgroud)
所以如果你看到上面的20202020十六进制2 spaces aka ' '
第二个问题(不是上述情况的延续)
我还有像这样的 varchar (50) col 的数据
HMSA
232434343
HMSA
4343434343
434343434
Run Code Online (Sandbox Code Playgroud)
这里 theHMSA有一个尾随空格,2020 HEX但其他值没有trailing spaces。不知道发生了什么。现在这里不varchar应该扔掉所有尾随空格吗?数据如何以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
Run Code Online (Sandbox Code Playgroud)
好吧,看看这是什么样子
7961646120202020 yada /*There are 4 spaces - 20 x 4 */
Run Code Online (Sandbox Code Playgroud)
所以在第二次插入它扔掉了空间比较部分并做了一个 trim(oldvalue) vs trim ( new value )
Q1:当你运行一个SELECT FORMAT(3455435), TYPE(3455435)你得到-(10)9 INTEGER
每个数据类型总是有一个 Cobol 风格的格式,用于在字符串之间进行转换。在您的情况下,源和目标的数据类型不匹配,Teradata 进行了自动类型转换。整数的格式最多为十位数字加上前导符号右对齐。
使用标准 SQL 的显式类型CAST转换不应用格式,因此没有前导空格。所以简单地做CAST(3455435 AS VARCHAR(20)or (TRIM(3455435)` 代替。
Q2:VarChar 存储您插入的内容,'1234 '即将存储包括两个空格。并且基于标准 SQL 比较规则,在比较字符串时会忽略尾随空格,因此'yada '和'yada'被认为是相等的(您可能之前使用过 Oracle,在这种情况下它不遵循标准 SQL)。