[英]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.