โปรดอธิบายว่า Wordpress ทำงานกับชุดตัวอักษรและการเรียงตัวของ MySQL ในระดับต่ำได้อย่างไร


10

เป็นชื่อคำถามที่แนะนำฉันต้องการเข้าใจว่า Wordpress ทำงานกับชุดอักขระของ MySQL และตัวเลือกการเรียงหน้าอย่างไร อย่างที่ฉันจะแสดงด้านล่างสิ่งต่าง ๆ ไม่สมเหตุสมผลกับฉัน ...

ฉันติดตั้ง Wordpress โดยทำตามคำแนะนำในหน้าการติดตั้ง:

https://codex.wordpress.org/Installing_WordPress

เป็นส่วนหนึ่งของคำแนะนำฉันทำตามคำแนะนำของพวกเขาสำหรับการสร้างฐานข้อมูล MySQL บน commandline คือคำสั่ง:

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

นอกจากนี้ตามคำแนะนำฉันแก้ไขไฟล์ "wp-config.php" เพื่อใช้ชุดอักขระ UTF-8:

define( 'DB_CHARSET', 'utf8' );

... และปล่อยให้การตั้งค่าการเรียงหน้าว่างเปล่า:

define( 'DB_COLLATE', '' );

ที่นี่คือที่ที่ความสนุกเริ่มต้น ...

  1. หากฉันป้อนอักขระที่ไม่ได้เป็นส่วนหนึ่งของ MySQL UTF-8 แต่เป็นส่วนหนึ่งของ UTF-8 MB4 เช่น𝌆ลงในโพสต์มันจะแสดงขึ้นอย่างถูกต้องในหน้าที่แสดงผล ฉันคาดหวังว่าสิ่งนี้จะไม่เกิดขึ้นเพราะฉันไม่ได้ตั้งค่าชุดอักขระเป็น UTF-8 MB4 แต่เป็น UTF-8 ที่ จำกัด มากขึ้น (ตามที่กำหนดโดย MySQL แน่นอนไม่เป็นที่เข้าใจกันโดยทั่วไป)

  2. หากฉันตรวจสอบปัญหาใน MySQL บน commandline ก็จะได้รับแปลก ถ้าฉันวิ่งshow variables like 'char%';ฉันจะได้รับการตอบสนองนี้:

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

ฉันคาดว่าจะมีการตั้งค่าอักขระฐานข้อมูลเป็น UTF-8 ไม่ใช่ latin1

  1. หากฉันรันคำสั่งshow variables like 'collation%';เอาต์พุตคือ:

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

นั่นเป็นแม้แต่คนแปลกหน้าด้วยเหตุผลที่ชัดเจน (ไม่คาดว่าจะมีการจัดเรียง latin1_swedish_ci เริ่มต้นในฐานข้อมูล UTF-8)

  1. ในที่สุดถ้าฉันเรียกใช้show full columns from mywpdatabase.wp_posts;บรรทัดเอาต์พุตที่ค่าไม่เป็น NULL ให้แสดงการเรียงเป็น:

| post_content_filtered | longtext | utf8mb4_unicode_ci |

คำถามของฉัน - จะอธิบายได้อย่างไร? ทำไม Wordpress ของฉันติดตั้งอย่างถูกต้องแสดงอักขระ UTF-8 MB4 เมื่อฐานข้อมูลถูกกำหนดเป็น UTF-8 ในการกำหนดค่า และทำไมฐานข้อมูลที่แสดงใน MySQL เป็นลาติน 1, การจัดเรียงภาษาสวีเดนแทน UTF-8 และทำไมถึงเป็นเช่นนั้นถึงแม้ว่าจะมีทั้งหมดนี้แต่ละเขตข้อมูลในตารางคือ utf8mb4_unicode_ci? คำอธิบายระดับต่ำเกี่ยวกับวิธีที่ Wordpress ทำงานกับ MySQL จะมีประโยชน์มาก ขอบคุณ!

คำตอบ:


11

มีสองกำหนดใน wp-config.php ของเว็บไซต์ WordPress:

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

มีหลายสิ่งที่เข้าใจผิดโดยทั่วไปมากที่สุด ชื่อของค่าคงที่ในนิยามเหล่านั้นอาจแนะนำว่าเกี่ยวข้องกับฐานข้อมูลนั้น พวกเขาจะไม่. พวกเขาเกี่ยวข้องกับตารางภายในฐานข้อมูล

การสร้างฐานข้อมูลนั้นเป็นอิสระจากการสร้างตาราง WordPress ไม่ได้สร้างฐานข้อมูลและไม่สนใจเกี่ยวกับชุดอักขระเริ่มต้นและการเรียงตัวของฐานข้อมูลตราบใดที่สามารถเชื่อมต่อกับฐานข้อมูลได้

ค่า 'utf8' ในการกำหนดครั้งแรกหมายถึงชุดอักขระที่ถูก จำกัด น้อยที่สุดจากตระกูล 'utf8' ซึ่งเป็น 'utf8' หรือ 'utf8mb4'

ถ้าคุณปล่อยให้คำจำกัดความข้างต้นไม่เปลี่ยนแปลงก่อนที่จะพยายามติดตั้งเว็บไซต์ของคุณมันก็เหมือนกับการบอกให้ WordPress ทำการเลือกของตัวเองเกี่ยวกับชุดอักขระของตารางฐานข้อมูลและการเปรียบเทียบซึ่งรองรับโดย MySQL (ขึ้นอยู่กับรุ่นของ MySQL) และ จำกัด อย่างน้อย

ต่อไปนี้คือสิ่งต่าง ๆ WordPress ทำการวิเคราะห์เพื่อกำหนดตัวเลือกระหว่างการติดตั้ง:

  • รุ่นของ MySQL
  • การเปรียบเทียบฐานข้อมูล (ใน wp-config.php)

WordPress ตัดสินใจเลือกเวอร์ชั่นของตระกูลutf8ที่ใช้ มีสองโดดเด่นด้วยชื่อของพวกเขาคือ: utf8และutf8mb4 ชุดอักขระจากกลุ่มutf8อนุญาตให้เก็บอักขระยาวสูงสุด 3 ไบต์ ชุดอักขระจากกลุ่มutf8mb4อนุญาตให้เก็บอักขระที่มีความยาวสูงสุด 4 ไบต์

ตอนนี้ WordPress ตรวจสอบค่าของDB_COLLATE ที่กำหนดไว้ หากว่างเปล่ามันจะใช้การ จำกัด การเรียงน้อยที่สุดจากตระกูลutf8 ที่เลือกมิฉะนั้นจะใช้ค่าที่ระบุ

ตัวอย่าง

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

หาก MySQL ไม่สนับสนุนutf8mb4 (รุ่นเก่า) แล้วชุดโต๊ะตัวละครจะเป็นutf8และการเปรียบเทียบจะ utf8_general_ci มิฉะนั้นเราสามารถคาดหวังutf8mb4และutf8mb4_unicode_520_ciหรือutf8mb4_unicode_ci (ขึ้นกับรุ่นของ MySQL) ตามลำดับ

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

MySQL รุ่นเก่า - utf8และutf8_polish_ci รุ่น MySQL ที่ใหม่กว่า - utf8mb4และutf8mb4_polish_ci ( ส่วนต่อท้าย_polish_ciได้รับเกียรติ)

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

รุ่นใด MySQL - CP1250และcp1250_polish_ci

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

เวอร์ชัน MySQL ใด ๆ - ข้อผิดพลาด (ไม่ตรงกับชุดอักขระและการเรียง)

สรุป

ในกรณีส่วนใหญ่การปล่อยให้ค่าการกำหนดอธิบายไว้ข้างต้นไม่เปลี่ยนแปลงเป็นตัวเลือกที่ดี แต่ถ้าคุณต้องการให้การเรียงตารางตรงกับภาษาของเว็บไซต์ของคุณคุณสามารถแก้ไขค่าของการกำหนดDB_COLLATE ได้อย่างเหมาะสม (ตัวอย่างเช่น - utf8mb4_polish_ci )

หมายเหตุ:นั่นอธิบายว่าเหตุใดจึงมีการจัดเก็บและดึงข้อมูลอักขระ properly อย่างเหมาะสม เพียงแค่ชุดอักขระตารางของคุณเป็นutf8mb4กลุ่มไม่utf8


1
ขอบคุณที่อธิบายว่า Wordpress ตั้งค่าการเรียงหน้าอย่างไร แต่คุณยังไม่ได้ระบุจุดที่เหลือ เหตุใดถ้ากำหนดชุดอักขระ UTF-8 ไว้ MySQL จะแสดงฐานข้อมูลว่าเป็น latin1 หรือไม่ และทำไมถึงแสดงการเปรียบเทียบฐานข้อมูลว่าเป็นชาวสวีเดน? นอกจากนี้ดูเหมือนว่าคุณจะสับสนชุดอักขระและการเปรียบเทียบ การเรียงหน้าจะกำหนดการเรียงลำดับกฎการเปรียบเทียบเท่านั้นไม่ใช่ชุดอักขระ ดังนั้นไม่ว่าจะใช้การเรียงหน้าแบบใดหาก UTF-8 เป็นชุดอักขระอักขระภายนอก (ตามที่กำหนดไว้ในความหมาย MySQL ที่แคบกว่า) ไม่ควรแสดงผล
X-Mann

ฉันจะอัปเดตคำตอบของฉันเพื่ออธิบายกระบวนการให้ชัดเจนยิ่งขึ้น
Frank P. Walentynowicz

1
ขอบคุณสำหรับการอัพเดท! ฉันยอมรับคำตอบของคุณแล้วตอนนี้มันชัดเจนแล้ว ปัญหาเกิดขึ้นกับ MySQL และการขาดความเชี่ยวชาญของฉัน - ฉันไม่รู้ว่าตารางสามารถใช้ชุดอักขระที่กว้างกว่าฐานข้อมูลได้ ข้อมูลใหม่นี้ทำให้ฉันสบายใจ ฉันไม่จำเป็นต้องเปลี่ยนชุดอักขระเริ่มต้นใน MySQL, Wordpress จะดูแลมันที่ระดับตาราง
X-Mann

ยินดี. ฉันดีใจที่มันช่วย
Frank P. Walentynowicz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.