Teradata SQL VARCHAR 和空格
Teradata SQL VARCHAR and spaces
当我将数字数据简单地插入到 varchar 中时,我不太理解
字段为什么用 2 spaces 左填充它。 varchar 不应该 trim 关闭 spaces(尾随好...但是你 "frontpad" 与 spaces 的规则在哪里)。为什么然后用 2 个前导 spaces
填充
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 ' '
第二题(不是上述情况的延续)
我也有像这样的 varchar (50) col 的数据
HMSA
232434343
HMSA
4343434343
434343434
这里的 HMSA
有尾随 space 2020 HEX
但其他值没有 trailing spaces
。不确定发生了什么。现在 varchar
不应该丢弃所有尾随的 space 吗?数据如何登陆 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 */
所以在第 2 次插入时它放弃了 space 比较部分并做了 trim(oldvalue) vs trim ( new value )
Q1:当你 运行 a 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'
被认为是相等的(您可能之前使用过不遵循标准 [=28 的 Oracle =] 在这种情况下)。
当我将数字数据简单地插入到 varchar 中时,我不太理解 字段为什么用 2 spaces 左填充它。 varchar 不应该 trim 关闭 spaces(尾随好...但是你 "frontpad" 与 spaces 的规则在哪里)。为什么然后用 2 个前导 spaces
填充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 ' '
第二题(不是上述情况的延续)
我也有像这样的 varchar (50) col 的数据
HMSA
232434343
HMSA
4343434343
434343434
这里的 HMSA
有尾随 space 2020 HEX
但其他值没有 trailing spaces
。不确定发生了什么。现在 varchar
不应该丢弃所有尾随的 space 吗?数据如何登陆 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 */
所以在第 2 次插入时它放弃了 space 比较部分并做了 trim(oldvalue) vs trim ( new value )
Q1:当你 运行 a 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'
被认为是相等的(您可能之前使用过不遵循标准 [=28 的 Oracle =] 在这种情况下)。