Nama kolom adalah pengidentifikasi, dan detail sintaksis untuk pengidentifikasi dijelaskan di:
http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
TL;DR :gunakan U&"..."
sintaks untuk menyuntikkan karakter yang tidak dapat dicetak ke dalam pengidentifikasi melalui titik kode Unicode mereka, dan tidak ada cara untuk menyatukan CR,LF
dengan LF
sendirian.
Cara merujuk ke kolom dalam satu baris
Kami diizinkan menggunakan urutan pelarian Unicode dalam pengidentifikasi, jadi menurut dokumentasi, berikut ini berfungsi:
select U&"first\000asecond" from Two;
jika itu hanya karakter baris baru di antara dua kata.
Apa yang terjadi dengan kueri pada tabel pertama
Tabel dibuat dengan:
CREATE TABLE One("first\nsecond" text);
Karena karakter garis miring terbalik tidak memiliki arti khusus di sini, kolom ini tidak berisi baris baru. Kolom ini berisi first
diikuti oleh \
diikuti oleh n
diikuti oleh second
.Jadi:
SELECT "first\nsecond" from One;
berfungsi karena sama dengan yang ada di CREATE TABLE
sedangkan
SELECT "first
second" from One;
gagal karena ada baris baru di SELECT di mana nama kolom sebenarnya dalam tabel memiliki garis miring terbalik diikuti oleh n
.
Apa yang terjadi dengan kueri pada tabel kedua
Ini adalah kebalikan dari "Satu".
CREATE TABLE Two("first
second" text);
Baris baru diambil kata demi kata dan merupakan bagian dari kolom. Jadi
SELECT "first
second" from Two;
berfungsi karena baris baru ada persis seperti di CREATE TABLE, dengan baris baru yang disematkan, sedangkan
SELECT "first\nsecond" from Two;
gagal karena seperti sebelumnya \n
dalam konteks ini tidak berarti baris baru.
Carriage Return diikuti oleh Newline, atau yang lebih aneh
Seperti yang disebutkan dalam komentar dan hasil edit Anda, ini bisa berupa carriage return dan baris baru sebagai gantinya, dalam hal ini hal berikut harus dilakukan:
select U&"first\000d\000asecond" from Two;
meskipun dalam pengujian saya, tekan Enter di tengah kolom dengan psql
di Unix dan Windows memiliki efek yang sama:satu baris baru di nama kolom.
Untuk memeriksa karakter persis apa yang berakhir dalam nama kolom, kita dapat memeriksanya dalam heksadesimal.
Saat diterapkan ke contoh tabel buat Anda, dari dalam psql di bawah 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';
Hasilnya adalah:
convert_to
----------------------------
\x66697273740a7365636f6e64
Untuk kasus yang lebih kompleks (misalnya karakter non-ascii dengan beberapa byte dalam UTF-8), kueri yang lebih canggih mungkin membantu, untuk titik kode yang mudah dibaca:
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