PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Имена на колони с нов ред

Имената на колоните са идентификатори и кървавите подробности за синтаксиса за идентификатори са описани на:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails:Как да използвате обхват за намиране на елемент в масив от масиви

  2. Една система за сигурност за приложения, пул на връзки и PostgreSQL - Случаят за LDAP

  3. намиране на MAX(db_timestamp) заявка

  4. Ограничение на PostgreSQL - само един ред може да има зададен флаг

  5. Как да сравним данни между две бази данни в PostgreSQL?