Názvy sloupců jsou identifikátory a krvavé podrobnosti syntaxe identifikátorů jsou popsány na adrese:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :použijte U&"..."
syntaxe pro vkládání netisknutelných znaků do identifikátorů prostřednictvím jejich kódových bodů Unicode a neexistuje způsob, jak sjednotit CR,LF
s LF
sám.
Jak odkazovat na sloupec v jednom řádku
V identifikátorech můžeme používat sekvence escape Unicode, takže podle dokumentace funguje následující:
select U&"first\000asecond" from Two;
pokud je to pouze znak nového řádku mezi dvěma slovy.
Co se stane s dotazy v první tabulce
Tabulka je vytvořena pomocí:
CREATE TABLE One("first\nsecond" text);
Protože zde znak zpětného lomítka nemá žádný zvláštní význam, tento sloupec neobsahuje žádný nový řádek. Obsahuje first
následovaný \
následuje n
následuje second
.Takže:
SELECT "first\nsecond" from One;
funguje, protože je stejný jako v CREATE TABLE
zatímco
SELECT "first
second" from One;
selže, protože v tomto SELECTu je nový řádek, kde skutečný název sloupce v tabulce má zpětné lomítko následované n
.
Co se stane s dotazy ve druhé tabulce
Toto je opak "Jedna".
CREATE TABLE Two("first
second" text);
Nový řádek je převzat doslovně a je součástí sloupce. Takže
SELECT "first
second" from Two;
funguje, protože nový řádek je tam přesně jako v CREATE TABLE, s vloženým novým řádkem, zatímco
SELECT "first\nsecond" from Two;
selže, protože jako dříve \n
v tomto kontextu neznamená nový řádek.
Carriage Return následovaný novým řádkem nebo něčím divnějším
Jak je uvedeno v komentářích a vaší úpravě, může to být návrat vozíku a nový řádek, v takovém případě by mělo fungovat následující:
select U&"first\000d\000asecond" from Two;
i když v mém testu stiskněte Enter uprostřed sloupce s psql
na Unixu a Windows má stejný účinek:jeden nový řádek v názvu sloupce.
Abychom zjistili, jaké přesné znaky skončily v názvu sloupce, můžeme je zkontrolovat v šestnáctkové soustavě.
Při použití na váš příklad vytvoření tabulky zevnitř psql pod 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';
Výsledek je:
convert_to
----------------------------
\x66697273740a7365636f6e64
U složitějších případů (např. ne-ascii znaky s několika bajty v UTF-8) může pomoci pokročilejší dotaz pro snadno čitelné kódové body:
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