कृपया बताएं कि वर्डप्रेस MySQL वर्ण सेट और निचले स्तर पर टकराव के साथ कैसे काम करता है


10

जैसा कि प्रश्न शीर्षक से पता चलता है, मैं यह समझने की कोशिश कर रहा हूं कि वर्डप्रेस MySQL वर्ण सेट और कोलाजेशन विकल्पों के साथ कैसे काम करता है। जैसा कि मैं नीचे दिखाऊंगा, चीजें मेरे लिए बहुत मायने नहीं रखती ...

मैंने उनके इंस्टालेशन पेज पर दिए निर्देशों का पालन करते हुए वर्डप्रेस स्थापित किया:

https://codex.wordpress.org/Installing_WordPress

निर्देशों के भाग के रूप में, मैंने कमांड पर MySQL डेटाबेस के मैनुअल निर्माण के लिए उनकी सलाह का पालन किया, अर्थात् कमांड:

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

आगे, निर्देश के अनुसार, मैंने UTF-8 वर्ण सेट का उपयोग करने के लिए "wp-config.php" फ़ाइल संपादित की:

define( 'DB_CHARSET', 'utf8' );

... और कोलाज सेटिंग को खाली छोड़ दिया:

define( 'DB_COLLATE', '' );

यहाँ है जहाँ मज़ा शुरू होता है ...

  1. यदि मैं एक ऐसे चरित्र में प्रवेश करता हूं जो MySQL UTF-8 का हिस्सा नहीं है, लेकिन UTF-8 MB4 का हिस्सा है, जैसे कि 𝌆, एक पोस्ट में, यह रेंडर किए गए पेज पर सही ढंग से दिखाई देता है। मुझे उम्मीद थी कि ऐसा नहीं होगा, क्योंकि मैंने चरित्र सेट को UTF-8 MB4 में सेट नहीं किया है, लेकिन अधिक प्रतिबंधित UTF-8 (जैसा कि MySQL द्वारा परिभाषित है, आमतौर पर समझा नहीं गया है)।

  2. यदि मैं कमांड लाइन पर MySQL में समस्या की जांच करता हूं, तो यह अजीब हो जाता है। अगर मैं दौड़ता हूं 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 होगा, न कि लैटिन 1।

  1. यदि मैं कमांड चलाता हूं show variables like 'collation%';, तो आउटपुट है:

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

यह भी स्पष्ट कारणों के लिए अजनबी है, (किसी UTF-8 डेटाबेस में डिफ़ॉल्ट latin1_swiki_ci टकराव की उम्मीद नहीं की जाएगी)।

  1. अंत में, यदि मैं चलाता हूं show full columns from mywpdatabase.wp_posts;, तो आउटपुट लाइनें, जहां मान NULL नहीं है, होने के लिए कोलाज दिखाएं:

| post_content_filtered | longtext | utf8mb4_unicode_ci |

मेरा प्रश्न तब - यह कैसे समझाया जा सकता है? जब मेरे डेटाबेस को UTF-8 के रूप में परिभाषित किया जाता है तो मेरे वर्डप्रेस ने UTF-8 MB4 वर्णों को सही तरीके से क्यों स्थापित किया है? और डेटाबेस डेटाबेस में UTF-8 के बजाय MySQL को लैटिन 1, सनी कोलेशन के रूप में क्यों दिखा रहा है? और कैसे आए, कि इस सब के बावजूद, तालिका में व्यक्तिगत क्षेत्र utf8mb4_unicode_ci हैं? जिस तरह से WordSQL MySQL के साथ काम करता है उसका एक निम्न-स्तरीय स्पष्टीकरण बहुत मददगार होगा। धन्यवाद!

जवाबों:


11

वर्डप्रेस वेबसाइट के wp-config.php में दो परिभाषित हैं:

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

कई चीजें हैं जो सबसे ज्यादा गलत समझी जाती हैं। उन परिभाषितों में स्थिरांक के नाम, सुझाव दे सकते हैं कि वे डेटाबेस से संबंधित हैं। वो नहीं हैं। वे डेटाबेस के भीतर तालिकाओं से संबंधित हैं।

डेटाबेस निर्माण तालिका निर्माण से पूरी तरह से स्वतंत्र है। वर्डप्रेस एक डेटाबेस नहीं बनाता है और डेटाबेस के डिफ़ॉल्ट चरित्र सेट और टकराव के बारे में परवाह नहीं करता है, जब तक कि यह डेटाबेस से जुड़ सकता है।

पहले परिभाषित अर्थ में 'utf8' का मान, 'utf8' परिवार से निर्धारित सबसे कम प्रतिबंधित चरित्र है, जो 'utf8' या 'utf8mb4' है।

यदि आप अपनी वेबसाइट को स्थापित करने के प्रयास से पहले अपरिवर्तित ऊपर परिभाषित छोड़ देते हैं, तो यह डेटाबेस के टेबल कैरेक्टर सेट और कोलाजेशन के बारे में वर्डप्रेस को अपनी पसंद बताने के लिए है, जो MySQL (MySQL संस्करण के आधार पर) द्वारा समर्थित हैं और कम से कम सीमित हैं।

स्थापना के दौरान वर्डप्रेस अपने विकल्पों को निर्धारित करने के लिए विश्लेषण करता है:

  • MySQL का संस्करण
  • डेटाबेस की टक्कर (wp-config.php में)

MySQL के संस्करण के आधार पर, वर्डप्रेस तय करता है कि utf8 परिवार के किस समूह का उपयोग करना है। उनके नाम से प्रतिष्ठित दो हैं: utf8 और utf8mb4Utf8 समूह से वर्ण सेट , अधिकतम 3-बाइट्स लंबे वर्णों के भंडारण की अनुमति देता है। Utf8mb4 समूह से वर्ण सेट , अधिकतम 4-बाइट्स लंबे वर्णों के भंडारण की अनुमति देता है।

अब, वर्डप्रेस 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_pould_ci । नया MySQL संस्करण - utf8mb4 और utf8mb4_pवेश_ci ( _polen_ci प्रत्यय सम्मानित किया गया है)

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

कोई भी MySQL संस्करण - cp1250 और cp1250_pould_ci

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

किसी भी MySQL संस्करण - त्रुटि (चरित्र सेट और टकराव का बेमेल)

सारांश

ज्यादातर मामलों में, परिभाषित मानों को छोड़कर, ऊपर समझाया गया है, अपरिवर्तित, एक अच्छा विकल्प है। लेकिन, यदि आप अपनी वेबसाइट की भाषा से मेल खाने के लिए तालिकाओं का टकराव चाहते हैं, तो आप उचित रूप से DB_COLLATE परिभाषित मूल्य को संशोधित कर सकते हैं (उदाहरण के लिए - utf8mb4_pOLD_ci )।

नोट: यह बताता है कि, वर्ण that को क्यों संग्रहीत और ठीक से पुनर्प्राप्त किया गया था। बस, आपके टेबल कैरेक्टर सेट utf8mb4 ग्रुप के हैं, utf8 के नहीं ।


1
यह समझाने के लिए धन्यवाद कि Wordpress कैसे टकराव सेट करता है, लेकिन आपने बाकी बिंदुओं को संबोधित नहीं किया है। क्यों, अगर UTF-8 वर्ण सेट को परिभाषित किया जाता है, तो MySQL डेटाबेस को latin1 के रूप में दिखा रहा है? और यह सनी के रूप में डेटाबेस टकराव क्यों दिखा रहा है? इसके अलावा, आप वर्ण सेट और टकराव को भ्रमित करते हैं। टकराव केवल आदेश, तुलना नियमों को परिभाषित करता है, चरित्र सेट को नहीं। इसलिए, कोई फर्क नहीं पड़ता कि क्या टकराव का उपयोग किया जाता है, अगर यूटीएफ -8 चरित्र सेट है, तो इसके बाहर के चरित्र (जैसा कि संकीर्ण MySQL अर्थ में परिभाषित किया गया है) को प्रस्तुत नहीं करना चाहिए।
एक्स-मैन

मैं अधिक स्पष्ट रूप से प्रक्रिया को समझाने के लिए अपने उत्तर को अपडेट करूंगा।
फ्रैंक पी। वालेंटिनिकोविज़

1
अद्यतन के लिए धन्यवाद! मैंने आपका उत्तर स्वीकार कर लिया है, यह अब स्पष्ट है। मुद्दा MySQL के साथ है और इसमें मेरी विशेषज्ञता की कमी है - मुझे नहीं पता था कि टेबल डेटाबेस की तुलना में एक व्यापक चरित्र सेट का उपयोग कर सकते हैं। इस नई जानकारी ने मेरे दिमाग को शांत कर दिया है। मुझे MySQL में तयशुदा कैरेक्टर को बदलने की जरूरत नहीं है, वर्डप्रेस टेबल लेवल पर इसका ध्यान रखता है।
एक्स-मैन

आपका स्वागत है। मुझे खुशी है कि इसने मदद की।
फ्रैंक पी। वालेंटीनोविक्ज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.