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

PostgreSQL 9.1 sử dụng đối chiếu trong các câu lệnh chọn

Tôi không thể tìm thấy một lỗ hổng trong thiết kế của bạn. Tôi đã thử.

Ngôn ngữ và đối chiếu

Tôi đã xem lại câu hỏi này. Hãy xem xét trường hợp thử nghiệm trên sqlfiddle này . Nó dường như hoạt động tốt. Tôi thậm chí đã tạo ngôn ngữ ca_ES.utf8 trong máy chủ thử nghiệm cục bộ của tôi (PostgreSQL 9.1.6 trên Debian Squeeze) và thêm ngôn ngữ vào cụm DB của tôi:

CREATE COLLATION "ca_ES" (LOCALE = 'ca_ES.utf8');

Tôi nhận được kết quả tương tự như có thể thấy trong sqlfiddle ở trên.

Lưu ý rằng tên đối chiếu là số nhận dạng và cần được đặt dấu ngoặc kép để giữ nguyên cách viết của CamelCase như "ca_ES" . Có thể đã có một số nhầm lẫn với các ngôn ngữ khác trong hệ thống của bạn? Kiểm tra ảnh ghép có sẵn của bạn :

SELECT * FROM pg_collation;

Nói chung, các quy tắc đối chiếu bắt nguồn từ ngôn ngữ hệ thống . Đọc về chi tiết trong sách hướng dẫn tại đây . Nếu bạn vẫn nhận được kết quả không chính xác, tôi sẽ cố gắng cập nhật hệ thống của bạn và tạo lại ngôn ngữ cho "ca_ES" . Trong Debian (và các bản phân phối Linux có liên quan), điều này có thể được thực hiện với:

dpkg-reconfigure locales

NFC

Tôi có một ý tưởng khác: chuỗi UNICODE không chuẩn hóa .

Có thể là 'Àudio' của bạn trên thực tế là '̀ ' || 'Audio' ? Đó sẽ là ký tự này:

SELECT U&'\0300A';
SELECT ascii(U&'\0300A');
SELECT chr(768);

Đọc thêm về dấu sắc trong wikipedia .
Bạn phải SET standard_conforming_strings = TRUE để sử dụng các chuỗi Unicode như trong dòng đầu tiên.

Lưu ý rằng một số trình duyệt không thể hiển thị các ký tự Unicode không chuẩn hóa một cách chính xác và nhiều phông chữ không có glyph thích hợp cho các ký tự đặc biệt, vì vậy bạn có thể không thấy gì ở đây hoặc vô nghĩa. Nhưng UNICODE cho phép điều đó vô nghĩa. Kiểm tra xem bạn nhận được gì:

SELECT octet_length('̀A')  -- returns 3 (!)
SELECT octet_length('À')  -- returns 2

Nếu đó là những gì cơ sở dữ liệu của bạn đã ký hợp đồng, bạn cần phải loại bỏ nó hoặc gánh chịu hậu quả. Cách chữa là chuẩn hóa chuỗi của bạn thành NFC . Perl có các kỹ năng UNICODE-foo vượt trội, bạn có thể sử dụng các thư viện của họ trong một hàm plperlu để làm điều đó trong PostgreSQL. Tôi đã làm điều đó để cứu tôi khỏi cơn điên.

Đọc hướng dẫn cài đặt trong bài viết tuyệt vời này về Chuẩn hóa UNICODE trong PostgreSQL của David Wheeler .
Đọc tất cả chi tiết đẫm máu về Biểu mẫu chuẩn hóa Unicode tại unicode.org .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhân bản cơ sở dữ liệu / Postgres Streaming Replication

  2. chọn / hiển thị id sê-ri được chèn lần cuối trong postgres

  3. Có một hàm mất một năm, tháng và ngày để tạo một ngày trong PostgreSQL không?

  4. CHÈN LỆNH ::LỖI:giá trị cột không tồn tại

  5. Sao lưu thiết kế cơ sở dữ liệu PostgreSQL - không có dữ liệu