Như tiêu đề câu hỏi gợi ý, tôi đang tìm hiểu cách Wordpress hoạt động với các bộ ký tự và tùy chọn đối chiếu của MySQL. Như tôi sẽ trình bày dưới đây, mọi thứ không có ý nghĩa với tôi ...
Tôi đã cài đặt Wordpress bằng cách làm theo các hướng dẫn trên trang cài đặt của họ:
https://codex.wordpress.org/Installing_WordPress
Là một phần của hướng dẫn, tôi đã làm theo lời khuyên của họ để tạo thủ công cơ sở dữ liệu MySQL trên dòng lệnh, cụ thể là các lệnh:
mysql> CREATE DATABASE databasename;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname"
-> IDENTIFIED BY "password";
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> EXIT
Hơn nữa, như được hướng dẫn, tôi đã chỉnh sửa tệp "wp-config.php" để sử dụng bộ ký tự UTF-8:
define( 'DB_CHARSET', 'utf8' );
... và để trống cài đặt đối chiếu:
define( 'DB_COLLATE', '' );
Đây là nơi niềm vui bắt đầu ...
Nếu tôi nhập một ký tự không phải là một phần của MySQL UTF-8, nhưng là một phần của UTF-8 MB4, chẳng hạn như, vào một bài đăng, nó sẽ hiển thị chính xác trên trang được hiển thị. Tôi đã mong điều này sẽ không xảy ra, vì tôi đã không đặt ký tự thành UTF-8 MB4, nhưng UTF-8 bị hạn chế hơn (tất nhiên như được định nghĩa bởi MySQL, không được hiểu như thường).
Nếu tôi điều tra vấn đề trong MySQL theo dòng lệnh, nó sẽ trở nên kỳ lạ hơn. Nếu tôi chạy
show variables like 'char%';
, tôi nhận được phản hồi này:+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
Tôi đã mong đợi nhân vật cơ sở dữ liệu được đặt là UTF-8, không phải latin1.
Nếu tôi chạy lệnh
show variables like 'collation%';
, đầu ra là:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Điều đó thậm chí còn xa lạ, vì những lý do rõ ràng (sẽ không mong đợi đối chiếu latin1_swbur_ci mặc định trong cơ sở dữ liệu UTF-8).
- Cuối cùng, nếu tôi chạy
show full columns from mywpdatabase.wp_posts;
, các dòng đầu ra, trong đó giá trị không phải là NULL, hiển thị đối chiếu là:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Câu hỏi của tôi sau đó - làm thế nào điều này có thể được giải thích? Tại sao Wordpress của tôi cài đặt hiển thị chính xác các ký tự UTF-8 MB4, khi cơ sở dữ liệu được xác định là UTF-8 trong cấu hình? Và tại sao cơ sở dữ liệu hiển thị trong MySQL là Latin1, đối chiếu Thụy Điển, thay vì UTF-8? Và tại sao, mặc dù tất cả điều này, các trường riêng lẻ trong bảng là utf8mb4_unicode_ci? Một lời giải thích cấp thấp về cách Wordpress làm việc với MySQL sẽ rất hữu ích. Cảm ơn bạn!