Seperti yang disarankan judul pertanyaan, saya ingin memahami bagaimana Wordpress bekerja dengan set karakter MySQL dan opsi pengumpulan. Seperti yang akan saya tunjukkan di bawah, hal-hal yang tidak masuk akal bagi saya ...
Saya menginstal Wordpress dengan mengikuti instruksi pada halaman instalasi mereka:
https://codex.wordpress.org/Installing_WordPress
Sebagai bagian dari instruksi, saya mengikuti saran mereka untuk pembuatan manual dari database MySQL pada commandline, yaitu perintah:
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
Selanjutnya, seperti yang diinstruksikan, saya mengedit file "wp-config.php" untuk menggunakan set karakter UTF-8:
define( 'DB_CHARSET', 'utf8' );
... dan biarkan pengaturan pemeriksaan kosong:
define( 'DB_COLLATE', '' );
Di sinilah kesenangan dimulai ...
Jika saya memasukkan karakter yang bukan merupakan bagian dari MySQL UTF-8, tetapi merupakan bagian dari UTF-8 MB4, seperti ๐, ke dalam sebuah postingan, itu akan ditampilkan dengan benar di halaman yang diberikan. Saya akan berharap ini tidak terjadi, karena saya belum menetapkan karakter yang ditetapkan ke UTF-8 MB4, tetapi UTF-8 lebih terbatas (seperti yang didefinisikan oleh MySQL tentu saja, tidak seperti yang dipahami secara umum).
Jika saya menyelidiki masalah di MySQL pada commandline, itu akan lebih aneh. Jika saya lari
show variables like 'char%';
, saya mendapat respons ini:+--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+
Saya akan mengharapkan karakter basis data ditetapkan menjadi UTF-8, bukan latin1.
Jika saya menjalankan perintah
show variables like 'collation%';
, hasilnya adalah:+----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
Itu bahkan lebih aneh, untuk alasan yang jelas (tidak akan mengharapkan pemeriksaan latin1_swedish_ci default dalam database UTF-8).
- Akhirnya, jika saya menjalankan
show full columns from mywpdatabase.wp_posts;
, garis output, di mana nilainya bukan NULL, tampilkan collation menjadi:
| post_content_filtered | longtext | utf8mb4_unicode_ci |
Pertanyaan saya kemudian - bagaimana ini bisa dijelaskan? Mengapa Wordpress saya menginstal dengan benar memberikan karakter UTF-8 MB4, ketika database didefinisikan sebagai UTF-8 dalam konfigurasi? Dan mengapa database ditampilkan di MySQL sebagai latin1, collation swedia, bukan UTF-8? Dan mengapa, terlepas dari semua ini, masing-masing bidang dalam tabel adalah utf8mb4_unicode_ci? Penjelasan tingkat rendah tentang cara Wordpress bekerja dengan MySQL akan sangat membantu. Terima kasih!