簡體   English   中英

Teradata SQL VARCHAR和空格

[英]Teradata SQL VARCHAR and spaces

當我將數字數據簡單地插入varchar字段時,我不太了解,為什么要用2個空格左鍵填充它。 不是varchar應該剪裁空格(尾隨ok ...但是用空格“ 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 ' '十六進制

第二個問題(以上情況不繼續)
我也有這樣的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 )

Q1:當您運行SELECT FORMAT(3455435), TYPE(3455435)您會得到-(10)9 INTEGER

每個數據類型始終具有Cobol樣式的格式,用於在字符串之間進行轉換。 在您的情況下,源和目標的數據類型不匹配,Teradata進行了自動類型轉換。 整數格式最多為十位數字,外加前導符號右對齊

使用標准SQL CAST Explixit類型轉換不應用任何格式,因此不應用任何前導空格。 因此只需執行CAST(3455435 AS VARCHAR(20)或(TRIM(3455435))`。

Q2:VarChar完全存儲您插入的內容,即將存儲'1234 '包括兩個空格。 並且基於標准SQL比較規則,在比較字符串時會忽略尾隨空格,因此'yada ''yada'被認為是相等的(您可能與Oracle合作過,在這種情況下,它不遵循Standard SQL)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM