Имената на колоните са идентификатори и кървавите подробности за синтаксиса за идентификатори са описани на:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :използвайте U&"..."
синтаксис за инжектиране на непечатаеми знаци в идентификатори чрез техните Unicode кодови точки и няма начин да се унифицират CR,LF
с LF
сам.
Как да се обърнете към колоната в един ред
Разрешено ни е да използваме управляващи последователности на Unicode в идентификатори, така че според документацията следното работи:
select U&"first\000asecond" from Two;
ако това е само знак за нов ред между двете думи.
Какво се случва със заявките на първата таблица
Таблицата е създадена с:
CREATE TABLE One("first\nsecond" text);
Тъй като обратната наклонена черта няма специално значение тук, тази колона не съдържа нов ред. Съдържа first
последвано от \
последвано от n
последвано от second
.И така:
SELECT "first\nsecond" from One;
работи, защото е същото като това, което е в CREATE TABLE
докато
SELECT "first
second" from One;
не успее, защото има нов ред в този SELECT, където действителното име на колона в таблицата има обратна наклонена черта, последвана от n
.
Какво се случва със заявките във втората таблица
Това е обратното на „Едно“.
CREATE TABLE Two("first
second" text);
Новият ред се взема дословно и е част от колоната. Така че
SELECT "first
second" from Two;
работи, защото новият ред е там точно както в CREATE TABLE, с вграден нов ред, докато
SELECT "first\nsecond" from Two;
не успява, защото както преди \n
в този контекст не означава нов ред.
Връщане на каретка, последвано от нов ред или нещо по-странно
Както бе споменато в коментарите и вашата редакция, това може да бъде вместо това връщане на каретка и нов ред, в който случай трябва да се направи следното:
select U&"first\000d\000asecond" from Two;
въпреки че в моя тест, натискане на Enter в средата на колона с psql
на Unix и Windows има същия ефект:един нов ред в името на колоната.
За да проверим какви точно знаци са се озовали в името на колона, можем да ги проверим в шестнадесетична система.
Когато се прилага към вашия пример за създаване на таблица, от вътрешността на psql под Unix:
CREATE TABLE Two("first
second" text);
select convert_to(column_name::text,'UTF-8')
from information_schema.columns
where table_schema='public'
and table_name='two';
Резултатът е:
convert_to
----------------------------
\x66697273740a7365636f6e64
За по-сложни случаи (напр. не-ascii символи с няколко байта в UTF-8) може да помогне по-разширена заявка за лесни за четене кодови точки:
select c,lpad(to_hex(ascii(c)),4,'0') from (
select regexp_split_to_table(column_name::text,'') as c
from information_schema.columns
where table_schema='public'
and table_name='two'
) as g;
c | lpad
---+------
f | 0066
i | 0069
r | 0072
s | 0073
t | 0074
+| 000a
|
s | 0073
e | 0065
c | 0063
o | 006f
n | 006e
d | 0064