2016-08-29 9 views
1

Я не совсем понимаю, когда я делаю обычную вставку числовых данных в поле varchar , почему он оставил его на 2 пробела. Разве не varchar должен обрезать пробелы (trailing ok ... но где правило, что вы «frontpad» с пробелами). Почему тогда панель с 2-х ведущих пространствамиTeradata SQL VARCHAR и пробелы

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 ' '

2 Вопроса (не продолжение вышеуказанной ситуации)
Также у меня есть данные для VARCHAR (50) Col как этого

HMSA 
232434343 
HMSA 
4343434343 
434343434 

Здесь HMSA имеет косое пространство 2020 HEX, но другие значения не имеют trailing spaces. Не уверен, что происходит. Теперь здесь нет varchar Предполагается выбросить все конечные пробелы? как поступают данные с HMSA<space> Не уверен. Есть идеи ?

Ok так что давайте посмотрим на некоторые странности Исходя из этого:

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-вкладышем она сбросила сравнения пространство часть и сделал a trim(oldvalue) vs trim (new value)

ответ

3

Q1: Когда вы запустите SELECT FORMAT(3455435), TYPE(3455435), вы получите -(10)9INTEGER

Каждый тип данных всегда имеет формат стиля Cobol, используемый для литья в строку и из нее. В вашем случае типы данных источника и цели не совпадали, и Teradata сделал автоматический тип. Формат целого числа - до десяти цифр плюс лидирующий знак right aligend.

Тип эксклюзионного типа с использованием стандартного SQL CAST не применяет формат и, следовательно, не содержит пробелов. Так просто сделать CAST(3455435 AS VARCHAR(20) или (TRIM (3455435) `вместо

Q2:. А магазины VarChar именно то, что вы вводите, т.е. '1234 ' будет сохранен в том числе двух пространств И на основе стандартных правил сравнения SQL завершающих пробелов игнорируются при сравнении строк. , таким образом, 'yada ' и 'yada' считаются равными (вы, вероятно, работали с Oracle, перед которым в этом случае не следует Стандарт SQL).

+0

Спасибо .... Дитер, как всегда, замечательный объяснение и «новые новости» на так многие распространенные вещи, происходящие в мире db. Надеемся, что многие найдут этот ценный q & полезный – user1874594