PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tên cột có dấu ngắt dòng

Tên cột là số nhận dạng và chi tiết sâu sắc về cú pháp cho số nhận dạng được mô tả tại:

http://www.postgresql .org / docs / current / static / sql-Cú pháp-lexical.html # SQL-SYNTAX-IDENTIFIERS

TL; DR :sử dụng U&"..." cú pháp để đưa các ký tự không in được vào mã định danh thông qua mã mã Unicode của chúng và không có cách nào để thống nhất CR,LF với LF một mình.

Cách tham chiếu đến cột trong một dòng duy nhất

Chúng tôi được phép sử dụng chuỗi thoát Unicode trong các mã định danh, vì vậy theo tài liệu, những điều sau đây hoạt động:

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

nếu nó chỉ là một ký tự dòng mới giữa hai từ.

Điều gì xảy ra với các truy vấn trên bảng đầu tiên

Bảng được tạo bằng:

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

Vì ký tự gạch chéo ngược không có ý nghĩa đặc biệt ở đây nên cột này không chứa bất kỳ dòng mới nào. Nó chứa first theo sau là \ theo sau là n theo sau là second .Vì vậy:

 SELECT "first\nsecond" from One;

hoạt động vì nó giống với những gì trong CREATE TABLE

trong khi

SELECT "first
second" from One;

không thành công vì có một dòng mới trong CHỌN đó, nơi tên cột thực tế trong bảng có dấu gạch chéo ngược theo sau là n .

Điều gì xảy ra với các truy vấn trên bảng thứ hai

Điều này ngược lại với "One".

CREATE TABLE Two("first
second" text);

Dòng mới được lấy nguyên văn và là một phần của cột. Vì vậy,

SELECT "first
second" from Two;

hoạt động bởi vì dòng mới ở đó chính xác như trong TẠO BẢNG, với một dòng mới được nhúng, trong khi

SELECT "first\nsecond" from Two;

không thành công vì như \n trước đó trong ngữ cảnh này không có nghĩa là một dòng mới.

Vận chuyển trở lại theo sau là Newline hoặc bất kỳ thứ gì khác thường

Như đã đề cập trong phần nhận xét và bản chỉnh sửa của bạn, thay vào đó, đây có thể là ký tự xuống dòng và dòng mới, trong trường hợp này, bạn nên làm như sau:

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

mặc dù trong thử nghiệm của tôi, nhấn Enter ở giữa cột với psql trên Unix và Windows có cùng tác dụng:một dòng mới trong tên cột.

Để kiểm tra những ký tự chính xác nào đã kết thúc trong tên cột, chúng tôi có thể kiểm tra chúng ở dạng thập lục phân.

Khi được áp dụng cho ví dụ tạo bảng của bạn, từ psql bên trong 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';

Kết quả là:

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

Đối với các trường hợp phức tạp hơn (ví dụ:các ký tự không phải ascii với một số byte trong UTF-8), một truy vấn nâng cao hơn có thể hữu ích, đối với các điểm mã dễ đọc:

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. Làm cách nào để kiểm tra một chuỗi unicode Python để xem nó * thực sự * có phải là Unicode thích hợp không?

  2. psycopg2 + pgbouncer. Chế độ không đồng bộ với lỗi gevent

  3. Đẩy cơ sở dữ liệu SQLite sang Heroku bằng các lần nhấn?

  4. Postgres UUID JDBC không hoạt động

  5. PostgreSQL:Tại sao truy vấn này không sử dụng chỉ mục của tôi?