sql >> Database teknologi >  >> RDS >> PostgreSQL

Kolonnenavne med linjeskift

Kolonnenavne er identifikatorer, og de blodige detaljer i syntaksen for identifikatorer er beskrevet på:

http://www.postgresql .org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

TL;DR :brug U&"..." syntaks til at indsætte ikke-udskrivbare tegn i identifikatorer gennem deres Unicode-kodepunkter, og der er ingen måde at forene CR,LF med LF alene.

Sådan henvises til kolonnen på en enkelt linje

Vi har tilladelse til at bruge Unicode-escape-sekvenser i identifikatorer, så ifølge dokumentationen virker følgende:

select U&"first\000asecond" from Two;

hvis det kun er et linjeskift mellem de to ord.

Hvad sker der med forespørgslerne på den første tabel

Tabellen er oprettet med:

CREATE TABLE One("first\nsecond" text);

Da omvendt skråstreg ikke har nogen speciel betydning her, indeholder denne kolonne ikke nogen ny linje. Den indeholder first efterfulgt af \ efterfulgt af n efterfulgt af second .Så:

 SELECT "first\nsecond" from One;

virker, fordi det er det samme som det, der er i CREATE TABLE

hvorimod

SELECT "first
second" from One;

mislykkes, fordi der er en ny linje i den SELECT, hvor det faktiske kolonnenavn i tabellen har en omvendt skråstreg efterfulgt af en n .

Hvad sker der med forespørgslerne på den anden tabel

Dette er det modsatte af "One".

CREATE TABLE Two("first
second" text);

Den nye linje tages ordret og er en del af kolonnen. Så

SELECT "first
second" from Two;

fungerer, fordi den nye linje er der præcis som i OPRET TABEL, med en indlejret ny linje, mens

SELECT "first\nsecond" from Two;

mislykkes, fordi som tidligere \n betyder i denne sammenhæng ikke en ny linje.

Carriage Return efterfulgt af Newline eller noget mærkeligere

Som nævnt i kommentarer og din redigering, kan dette være vognretur og ny linje i stedet, i hvilket tilfælde følgende skal gøre:

select U&"first\000d\000asecond" from Two;

selvom jeg i min test trykkede Enter i midten af ​​en kolonne med psql på Unix og Windows har samme effekt:en enkelt ny linje i kolonnens navn.

For at kontrollere, hvilke nøjagtige tegn der endte i et kolonnenavn, kan vi inspicere dem i hexadecimal.

Når det anvendes på dit oprettet tabel eksempel, indefra psql under 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';

Resultatet er:

        convert_to         
----------------------------
 \x66697273740a7365636f6e64

For mere komplekse tilfælde (f.eks. ikke-ascii-tegn med flere bytes i UTF-8), kan en mere avanceret forespørgsel hjælpe, for letlæselige kodepunkter:

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. PHP:problemer med at udlæse utf8 fra MySQL-database ved brug af PDO

  2. Database tabelnavne med Django

  3. SQL Stored Procedure Parametre bliver ødelagt?

  4. Sådan gemmer eller henter du en matrixkolonne ved hjælp af Hibernate