2008-11-04 30 views
7

Tôi gặp sự cố nhỏ với ứng dụng php-gtk tiếp tục chạy vào chuỗi không phải utf8, tôi đã phát hiện thấy sự cố trong kết nối cơ sở dữ liệu, ngay cả khi cơ sở dữ liệu được cho là ở dạng UTF-8.Làm thế nào để thay đổi mã hóa ký tự của kết nối PDO/SQLite trong PHP?

Tôi đã thử với "SET CHARACTER SET utf8" (MySQL way) và "SET NAMES UTF8" và không có gì xảy ra (không có bất kỳ thông tin nào về lệnh này trong trang "Query Language Understood by SQLite ") Tôi không ngạc nhiên về điều đó).

PD: Có thể kết nối đã có trong UTF-8 và dữ liệu không có, nhưng nếu có cách thay đổi kết nối mã hóa câu hỏi này vẫn hữu ích.

Trả lời

8

Theo như tôi có thể biết, SQLite only has one setting for charset, ở cấp độ mỗi cơ sở dữ liệu. Bạn không thể thay đổi mã hóa trên kết nối.

API C có two different ways khi mở kết nối, như UTF-8 hoặc UTF-16. Tôi mong đợi mô-đun SQLite của PHP (Và do đó PDO) chỉ đơn giản sử dụng phiên bản UTF-8. Nếu đó là chính xác, tôi sẽ mong đợi rằng một kết nối SQLite luôn luôn là UTF-8. Điều này có nghĩa là bạn phải mã hóa/giải mã chuỗi theo cách thủ công với utf8_encode/utf8_decode.

Xem thêm: http://www.alberton.info/dbms_charset_settings_explained.html

+2

tôi đã phát hiện rằng "SQLite không phải là đặc biệt về văn bản mà nó nhận được và là hạnh phúc hơn để xử lý chuỗi văn bản mà không phải là bình thường hoặc thậm chí tốt được hình thành UTF-8 so với lập trình viên muốn. để lưu trữ dữ liệu IS08859 có thể làm ... "Soo văn bản có nguồn gốc trong ISO85 (cái gì đó) – levhita

+1

Tôi theo lời khuyên của bạn và thêm một vài utf8_encodes (cảm ơn các vị thần lập trình cho OOP) để mọi thứ đều utf8 ngay từ đầu. Cơ sở dữ liệu chính của tôi đã được tạo lại trong UTF8 và tôi vừa thêm các dòng đó vào hệ thống của tôi với một số cơ sở dữ liệu plugin. – levhita

+2

Trong trường hợp đó, bạn sẽ phải sử dụng utf8_decode khi truy xuất dữ liệu. Đây là tất cả chỉ cần thiết, nếu bạn sử dụng bộ ký tự mặc định của PHP (ISO-8859-1) trong nội bộ. Xem xét sử dụng UTF-8 tất cả thông qua hệ thống của bạn, trong trường hợp đó bạn không phải mã hóa bất cứ điều gì (Có, nó gây nhầm lẫn). – troelskn

Các vấn đề liên quan