Teradata SQL VARCHAR 和空格
Posted
技术标签:
【中文标题】Teradata SQL VARCHAR 和空格【英文标题】:Teradata SQL VARCHAR and spaces 【发布时间】:2017-01-06 01:40:44 【问题描述】:当我将数字数据简单地插入到 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
Hex 表示2 spaces aka ' '
第二个问题(不延续上述情况) 我也有像这样的 varchar (50 ) col 的数据
HMSA
232434343
HMSA
4343434343
434343434
这里HMSA
有一个尾随空格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
好吧,看看这是什么样子
7961646120202020 yada /*There are 4 spaces - 20 x 4 */
所以在第二次插入时,它抛弃了空间比较部分并做了一个trim(oldvalue) vs trim ( new value )
【问题讨论】:
【参考方案1】:Q1:当你运行 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'
被认为是相等的(您之前可能使用过 Oracle,在这种情况下不遵循标准 SQL)。
【讨论】:
谢谢.... Dieter 一如既往,对 db 世界中发生的许多常见事情进行了精彩的解释和“新消息”。希望很多人会发现这个有价值的问答很有用以上是关于Teradata SQL VARCHAR 和空格的主要内容,如果未能解决你的问题,请参考以下文章
sql teradata 过滤日期 - 数据库版本 Teradata 15.10.06.02 和提供程序版本 Teradata.Net 15.11.0.0