Lütfen Wordpress'in MySQL karakter seti ve harmanlama ile düşük seviyede nasıl çalıştığını açıklayın


10

Soru başlığının da belirttiği gibi, Wordpress'in MySQL karakter kümeleri ve harmanlama seçenekleriyle nasıl çalıştığını anlamaya çalışıyorum. Aşağıda göstereceğim gibi, işler benim için pek mantıklı değil ...

Wordpress'i kurulum sayfalarındaki talimatları izleyerek yükledim:

https://codex.wordpress.org/Installing_WordPress

Talimatların bir parçası olarak, komut satırında MySQL veritabanının manuel olarak oluşturulmasına ilişkin tavsiyelerini, yani komutları takip ettim:

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

Ayrıca, talimat verildiği gibi, UTF-8 karakter setini kullanmak için "wp-config.php" dosyasını düzenledim:

define( 'DB_CHARSET', 'utf8' );

... ve harmanlama ayarını boş bıraktı:

define( 'DB_COLLATE', '' );

İşte eğlence burada başlıyor ...

  1. MySQL UTF-8'in parçası olmayan, ancak 𝌆 gibi UTF-8 MB4'ün bir parçası olan bir karakteri bir gönderiye girersem, işlenen sayfada doğru olarak görünür. Karakter setini UTF-8 MB4 olarak ayarlamamıştım, ancak daha kısıtlı UTF-8'i (tabii ki MySQL tarafından tanımlandığı gibi, genel olarak anlaşılmadığı gibi) bunun olmasını beklemezdim.

  2. Komut satırında MySQL'de sorunu araştırırsam, garipleşir. Çalıştırırsam show variables like 'char%';şu yanıtı alırım:

    +--------------------------+----------------------------+
    | 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/ |
    +--------------------------+----------------------------+

Ben latin1 değil, UTF-8 olarak ayarlanan veritabanı karakter beklerdim.

  1. Komutu çalıştırırsam show variables like 'collation%';çıktı:

    +----------------------+-------------------+
    | Variable_name        | Value             |
    +----------------------+-------------------+
    | collation_connection | utf8_general_ci   |
    | collation_database   | latin1_swedish_ci |
    | collation_server     | latin1_swedish_ci |
    +----------------------+-------------------+

Bu, daha açık nedenlerden ötürü daha da garip (UTF-8 veritabanında varsayılan latin1_swedish_ci harmanlamasını beklemezdim).

  1. Son olarak, çalıştırırsam show full columns from mywpdatabase.wp_posts;, değerin NULL olmadığı çıktı satırları, harmanlamayı şu şekilde gösterir:

| post_content_filtered | longtext | utf8mb4_unicode_ci |

O zaman sorum - bu nasıl açıklanabilir? Wordpress kurulumum, veritabanı yapılandırmada UTF-8 olarak tanımlandığında neden UTF-8 MB4 karakterlerini doğru şekilde oluşturuyor? Ve veritabanı neden MySQL'de UTF-8 yerine latin1, isveç harmanlaması olarak gösteriliyor? Ve buna rağmen, buna rağmen, tablodaki bireysel alanlar utf8mb4_unicode_ci? Wordpress'in MySQL ile çalışma biçiminin düşük seviyeli açıklaması çok yardımcı olacaktır. Teşekkür ederim!

Yanıtlar:


11

WordPress web sitesinin wp-config.php dosyasında iki tanım vardır:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

En sık yanlış anlaşılan birkaç şey vardır. Bu tanımlardaki sabitlerin adları, veritabanının kendisiyle ilişkili olduklarını gösterebilir. Onlar değil. Bunlar veritabanındaki tablolarla ilişkilidir.

Veritabanı oluşturma tablo oluşturma işleminden tamamen bağımsızdır. WordPress bir veritabanı oluşturmaz ve veritabanına bağlanabildiği sürece veritabanının varsayılan karakter kümesini ve harmanlamasını umursamaz.

İlk tanımlamadaki 'utf8' değeri, 'utf8' veya 'utf8mb4' olan 'utf8' ailesinden en az kısıtlanmış karakter kümesi anlamına gelir.

Yukarıda tanımları değiştirmeden bırakırsanız, web sitenizi yüklemeye çalışmadan önce, WordPress'e MySQL tarafından desteklenen (MySQL sürümüne bağlı olarak) ve en az sınırlayıcı olan veritabanı tabloları karakter kümesi ve harmanlama ile ilgili kendi seçimlerini yapmasını söylemek gibi bir şeydir.

Yükleme sırasında WordPress seçimlerini belirlemek için analiz edilen şeyler şunlardır:

  • MySQL'in sürümü
  • veritabanının harmanlaması (wp-config.php içinde)

MySQL'in sürümüne göre, WordPress hangi utf8 ailesi grubunun kullanılacağına karar verir . İsimleriyle ayırt edilen iki tane var: utf8 ve utf8mb4 . Utf8 grubundan karakter setleri, maksimum 3 bayt uzunluğunda karakterlerin saklanmasına izin verir. Utf8mb4 grubundan karakter setleri, maksimum 4 bayt uzunluğunda karakterlerin saklanmasına izin verir.

Şimdi, WordPress DB_COLLATE tanımının değerini kontrol eder . Boşsa, seçilen utf8 ailesinden en az sınırlayıcı harmanlamayı kullanır, aksi takdirde belirtilen değeri kullanır.

Örnekler

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

MySQL utf8mb4'ü (eski sürümler) desteklemiyorsa tablo karakter seti utf8 ve harmanlama utf8_general_ci olacaktır . Aksi takdirde, sırasıyla utf8mb4 ve utf8mb4_unicode_520_ci veya utf8mb4_unicode_ci (MySQL sürümüne bağlı) bekleyebiliriz .

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', 'utf8_polish_ci');

Eski MySQL sürümü - utf8 ve utf8_polish_ci . Daha yeni MySQL sürümü - utf8mb4 ve utf8mb4_polish_ci ( _polish_ci soneki onurlandırılır)

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'cp1250_polish_ci');

Herhangi bir MySQL sürümü - cp1250 ve cp1250_polish_ci .

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'utf8_general_ci');

Herhangi bir MySQL sürümü - hata (karakter kümesi ve harmanlama uyuşmazlığı)

özet

Çoğu durumda, yukarıda açıklanan tanım değerlerini değişmeden bırakmak iyi bir seçimdir. Ancak, tablo harmanlamanın web sitenizin diliyle eşleşmesini istiyorsanız, DB_COLLATE tanımının değerini uygun şekilde değiştirebilirsiniz (örneğin - utf8mb4_polish_ci ).

Not: Bu, 𝌆 karakterinin neden düzgün bir şekilde saklandığını ve alındığını açıklar. Basitçe, senin tablolar karakter kümesi aitti utf8mb4 grubun değil, utf8 .


1
Wordpress'in harmanlamayı nasıl ayarladığını açıkladığınız için teşekkürler, ancak diğer noktalara değinmediniz. UTF-8 karakter kümesi tanımlanmışsa neden MySQL veritabanını latin1 olarak gösteriyor? Ve neden İsveççe olarak veritabanı harmanlama gösteriyor? Buna ek olarak, karakter seti ve harmanlama kafa karıştırıcı gibi görünüyor. Harmanlama, karakter kümesini değil, yalnızca sıralamayı, karşılaştırma kurallarını tanımlar. Bu nedenle, hangi harmanlama kullanılırsa kullanılsın, UTF-8 karakter kümesiyse, bunun dışındaki karakterler (daha dar MySQL anlamında tanımlandığı gibi) oluşturulmamalıdır.
X-Mann

Süreci daha net bir şekilde açıklamak için cevabımı güncelleyeceğim.
Frank P. Walentynowicz

1
Güncelleme için teşekkürler! Cevabınızı kabul ettim, şimdi hepsi açık. Sorun MySQL ve benim uzmanlık eksikliği ile - tabloların veritabanından daha geniş bir karakter kümesi kullanabileceğini bilmiyordum. Bu yeni bilgi aklımı rahatlattı. MySQL'de varsayılan karakter setini değiştirmeme gerek yok, Wordpress bunu tablo düzeyinde halleder.
X-Mann

Rica ederim. Yardımcı olduğuna sevindim.
Frank P. Walentynowicz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.