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 server中某字段含空格

teradata与SQL server有啥区别

sql teradata 过滤日期 - 数据库版本 Teradata 15.10.06.02 和提供程序版本 Teradata.Net 15.11.0.0

SQL/Teradata:如何返回特定值及其前面的行?

为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快

SQL Server char,varchar,nchar,nvarchar区别