समस्या कैसी दिखती है
पहले
INSERT INTO wp_posts (post_title) VALUES ('हिंदी à¤à¤¾à¤·à¤¾ और नाम');बाद में
INSERT INTO wp_posts (post_title) VALUES ('हिंदी भाषा और नाम');यह कहाँ से आता है
WordPress टेक्स्ट UTF-8 में रखता है। पर कई पुरानी साइटों में टेबल latin1 में बने थे या कनेक्शन latin1 से जुड़ता था। जब तक लिखने और पढ़ने में एक ही गलती हो, किसी को पता नहीं चलता। नए सर्वर पर जाने, phpMyAdmin से एक्सपोर्ट करने या कनेक्शन का charset बदलने पर हर हिंदी अक्षर अचानक कई अजीब चिह्नों में बदल जाता है।
wp-config.phpमेंDB_CHARSETका मानlatin1है या टेबल से मेल नहीं खाता।- डंप
latin1में एक्सपोर्ट हुआ औरutf8mb4में इम्पोर्ट हुआ, या उल्टा। - किसी प्लगइन या इम्पोर्ट स्क्रिप्ट ने पहले से बिगड़े टेक्स्ट को एक बार और बदल दिया। इससे दो बार बिगड़ा टेक्स्ट बनता है, जैसे
à ¤Â।
एक्सपोर्ट ठीक करें
- कुछ भी बदलने से पहले डेटाबेस का बैकअप लें।
- प्रभावित टेबल
.sqlफ़ाइल में एक्सपोर्ट करें, जैसे phpMyAdmin से याmysqldump --default-character-set=utf8mb4से। - फ़ाइल को ऊपर के बॉक्स में डालें। Mojibuster सिर्फ़ बिगड़ी जगहें ठीक करता है और हर बदलाव दिखाता है।
- ठीक की गई फ़ाइल डाउनलोड करें और उसे
utf8mb4के साथ नए टेस्ट डेटाबेस में इम्पोर्ट करें। - साइट जाँचें। सब सही दिखे तो असली डेटाबेस में इम्पोर्ट करें।
डंप कभी अपलोड नहीं होता। यह ज़रूरी है, क्योंकि उसमें अक्सर यूज़र खाते, ईमेल पते और कमेंट होते हैं। इस बारे में और कानूनी जानकारी में।
serialized डेटा से सावधान
WordPress कुछ सेटिंग wp_options और wp_postmeta में serialized PHP मान की तरह रखता है, जैसे s:12:"भाषा";। संख्या बाइट में लंबाई है (देवनागरी का हर अक्षर 3 बाइट लेता है)। जब टेक्स्ट की लंबाई बदलती है, तो संख्या मेल नहीं खाती और WordPress वह मान छोड़ देता है। इसलिए पहले wp_posts, wp_comments और wp_terms जैसी सामग्री वाली टेबल ठीक करें। options के लिए WP-CLI का wp search-replace बेहतर है, क्योंकि वह लंबाई भी अपडेट करता है।
MySQL में असली वजह ठीक करें
- टेबल और कनेक्शन
utf8mb4पर ले जाएँ औरwp-config.phpमेंdefine('DB_CHARSET', 'utf8mb4');रखें। - अगर
latin1कॉलम में UTF-8 बाइट पड़े हैं, तो उसे सीधे न बदलें, वरना टेक्स्ट दोबारा एन्कोड हो जाएगा। आम रास्ता बाइनरी टाइप से है: पहलेMODIFY … LONGBLOB, फिरMODIFY … LONGTEXT CHARACTER SET utf8mb4। - हर बदलाव पहले डेटाबेस की कॉपी पर आज़माएँ।
अक्सर पूछे जाने वाले सवाल
क्या पूरा WordPress डेटाबेस एक साथ ठीक हो सकता है?
हाँ, बड़े SQL डंप भी। पर wp_options और wp_postmeta के serialized डेटा का ध्यान रखें; वहाँ WP-CLI बेहतर है।
क्या डंप के सही अक्षर बदल जाएँगे?
नहीं। Mojibuster सिर्फ़ वही क्रम ठीक करता है जो साफ़ तौर पर बिगड़े हैं। सही टेक्स्ट जैसा है वैसा रहता है।
utf8 और utf8mb4 में क्या अंतर है?
MySQL में utf8 सिर्फ़ तीन बाइट तक के अक्षर रखता है, इसलिए इमोजी खो जाते हैं। utf8mb4 असली UTF-8 है और WordPress के लिए सही चुनाव।
क्या यह WordPress के अलावा दूसरे सिस्टम पर भी चलता है?
हाँ। Joomla, Drupal, Magento या MySQL/MariaDB पर आपका अपना ऐप, सबमें यही समस्या और यही हल है।