2012-05-29 2 views
1

Очень короткий вопрос. Может кто-нибудь сказать, почему этот запросPostgreSql. Странное поведение конкатенации

select LENGTH(' '::char || ' '::char), LENGTH(' '::text || ' '::char), LENGTH(' ' || ' '), LENGTH('a'::char || 'b'::char); 

возвращает

0 1 2 2 

пространство специальный характер ведьма не сцепить с другими строками?

Документация говорит только это:

Unless otherwise noted, all of the functions listed below work 
on all of these types, but be wary of potential effects of 
automatic space-padding when using the character type. 

Почему я это делаю? Потому что я строю строковый символ char в хранимой процедуре, и когда я пытаюсь конкатенировать varchar с char, ничего не происходит.

ответ

2

CHAR type «фиксированная длина, пустая прокладка». Это означает, что если вы храните "foobar" в поле char(10), Postgres фактически сохраняет "foobar " (это четыре конечных пробела, SO не сохраняет смежные пробелы). Когда вы возвращаете свое значение, любые конечные пробелы удаляются. То же самое происходит с ' '::char - его конечное пустое пространство лишено, оставив только строку нулевой длины.

+1

Таким образом, я изменил свой тип моей переменной, которая содержит currient char от char (1) до varchar (1), и everythign станет штрафом. Благодарю. – Yavanosta