Vì vậy, tôi có vài máy chủ Debian có PostgreSQL trên đó. Trong lịch sử, các máy chủ và PostgreSQL được bản địa hóa với bộ ký tự Latin 9 và sau đó nó vẫn ổn. Bây giờ chúng tôi phải xử lý những thứ như Ba Lan, Hy Lạp hoặc Trung Quốc, vì vậy thay đổi nó trở thành một vấn đề ngày càng tăng.
Khi tôi cố gắng tạo cơ sở dữ liệu UTF8, tôi nhận được thông báo:
LRI: mã hóa UTF8 không khớp với ngôn ngữ địa phương Chi tiết: Cài đặt LC_CTYPE được chọn yêu cầu mã hóa LATIN9.
Vài lần tôi đã thực hiện một số nghiên cứu về chủ đề này với Google cũ của tôi và tất cả những gì tôi có thể tìm thấy là một số quy trình quá phức tạp như cập nhật Debian LANG
, biên dịch lại PostgreQuery với bộ ký tự chính xác, chỉnh sửa tất cả các LC_
biến hệ thống và các giải pháp tối nghĩa khác. Vì vậy, trong thời gian này, chúng tôi để vấn đề này sang một bên.
Gần đây, nó đã trở lại một lần nữa, người Hy Lạp muốn những thứ đó và Latin 9 không muốn. Và trong khi tôi đang xem xét vấn đề này một lần nữa, một đồng nghiệp đã đến gặp tôi và nói rằng Nah, thật dễ dàng, nhìn đi.
Anh ta không chỉnh sửa gì, không làm trò ảo thuật, anh ta chỉ thực hiện truy vấn SQL này:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Và nó hoạt động tốt.
Tôi thực sự không biết LC_CTYPE='C'
và tôi đã ngạc nhiên khi sử dụng nó không phải là giải pháp đầu tiên trên Google và thậm chí trên Stack Overflow. Tôi nhìn xung quanh và tôi chỉ tìm thấy một đề cập trên tài liệu PostgreSQL.
Khi LC_CTYPE là C hoặc POSIX, mọi bộ ký tự đều được cho phép, nhưng đối với các cài đặt khác của LC_CTYPE, chỉ có một bộ ký tự sẽ hoạt động chính xác. Do cài đặt LC_CTYPE bị đóng băng bởi initdb, nên tính linh hoạt rõ ràng để sử dụng các mã hóa khác nhau trong các cơ sở dữ liệu khác nhau của cụm là lý thuyết hơn thực tế, ngoại trừ khi bạn chọn ngôn ngữ C hoặc POSIX (do đó vô hiệu hóa bất kỳ nhận thức địa phương thực nào).
Vì vậy, nó làm tôi tự hỏi, điều này là quá dễ dàng, quá hoàn hảo, nhược điểm là gì? Và tôi đã có một thời gian khó khăn để tìm một câu trả lời. Vì vậy, ở đây tôi đến đăng ở đây:
tl; dr: Nhược điểm của việc sử dụng LC_CTYPE='C'
trên một địa phương hóa cụ thể là gì? Làm nó là xấu? Tôi nên làm gì để phá vỡ?