איך נראית הבעיה
לפני
INSERT INTO wp_posts (post_title) VALUES ('×”×”×–×ž× ×” × ×©×œ×—×” בשבת');אחרי
INSERT INTO wp_posts (post_title) VALUES ('ההזמנה נשלחה בשבת');מאיפה זה בא
WordPress שומר טקסט ב-UTF-8. אבל התקנות ישנות רבות יצרו טבלאות ב-latin1, או התחברו למסד עם latin1. כל עוד הכתיבה והקריאה עושות את אותה טעות, אף אחד לא שם לב. אחרי מעבר לשרת חדש, ייצוא דרך phpMyAdmin או שינוי קידוד החיבור, כל אות עברית הופכת פתאום לשני תווים.
DB_CHARSETבקובץwp-config.phpהואlatin1או לא תואם לטבלאות.- הגיבוי יוצא כ-
latin1ויובא כ-utf8mb4– או להפך. - תוסף או סקריפט ייבוא המיר פעם נוספת טקסט שכבר היה פגום. כך נוצר קידוד כפול.
מתקנים את הייצוא
- גבו את מסד הנתונים לפני שמשנים משהו.
- ייצאו את הטבלאות הפגומות לקובץ
.sql, למשל דרך phpMyAdmin אוmysqldump --default-character-set=utf8mb4. - גררו את הקובץ לתיבה שלמעלה. Mojibuster מתקן רק את המקומות הפגומים ומראה כל שינוי.
- הורידו את הקובץ המתוקן וייבאו אותו עם
utf8mb4למסד בדיקה חדש. - בדקו את האתר. אם הכול נראה תקין, ייבאו למסד החי.
הגיבוי לא מועלה לשום מקום. זה חשוב, כי בדרך כלל יש בו חשבונות משתמשים, כתובות דוא"ל ותגובות.
זהירות עם נתונים מסודרים (serialized)
WordPress שומר חלק מההגדרות ב-wp_options וב-wp_postmeta כערכי PHP מסודרים, למשל s:8:"שלום";. המספר הוא האורך בבתים: ב-UTF-8 כל אות עברית תופסת שני בתים. לטקסט משובש יש אורך אחר מלטקסט מתוקן, ולכן אחרי התיקון המספר לא תואם ו-WordPress זורק את הערך. לכן מתקנים קודם טבלאות תוכן כמו wp_posts, wp_comments ו-wp_terms. להגדרות עדיף wp search-replace של WP-CLI, כי הוא מעדכן את האורכים.
פותרים את הסיבה ב-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 – את אלה WP-CLI מטפל טוב יותר.
האם תווים תקינים בגיבוי ישתנו?
לא. Mojibuster מתקן רק רצפים שבבירור פגומים. טקסט תקין נשאר כמו שהוא.
מה ההבדל בין utf8 ל-utf8mb4?
ב-MySQL, utf8 שומר רק תווים של עד שלושה בתים, ולכן אימוג'י הולכים לאיבוד. utf8mb4 הוא UTF-8 אמיתי והבחירה הנכונה ל-WordPress.
זה עובד גם למערכות אחרות מלבד WordPress?
כן. ל-Joomla, ל-Drupal, ל-Magento ולאפליקציה משלכם על MySQL או MariaDB אותה בעיה ואותו פתרון.