WordPress ומסדי נתונים: ×©×œ×•× או ???? במקום עברית

אחרי מעבר שרת, עדכון או ייצוא מסד נתונים, הפוסטים באתר מציגים פתאום ×©×œ×•× במקום שלום, או סימני שאלה? הנתונים כמעט תמיד עדיין קיימים – הם פשוט נקראים בקידוד הלא נכון. Mojibuster מתקן את הייצוא, ואחר כך מטפלים בסיבה במסד עצמו.

עובד עם טקסט ועם הקבצים האלה:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

למשל קובצי ייצוא מאקסל, גיבויים של מסדי נתונים, כתוביות וקוד של אתרים.

תיקון

  1. גררו קובץ או הדביקו טקסט
  2. התיקון נעשה אוטומטית
  3. העתיקו או הורידו את התוצאה
או גררו את הקובץ לכאן
  • בלי העלאה. הקבצים מתוקנים ישירות בדפדפן ולעולם לא יוצאים מהמכשיר שלכם.

  • שרתים באיחוד האירופי. Mojibuster פועל על שרת בפינלנד (האיחוד האירופי), ולכן חלה עליו תקנת הגנת המידע הכללית (GDPR). נוסח התקנה (EUR-Lex, באנגלית)

איך נראית הבעיה

שורה מגיבוי SQL אחרי מעבר לשרת חדש

לפני

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 – או להפך.
  • תוסף או סקריפט ייבוא המיר פעם נוספת טקסט שכבר היה פגום. כך נוצר קידוד כפול.

מתקנים את הייצוא

  1. גבו את מסד הנתונים לפני שמשנים משהו.
  2. ייצאו את הטבלאות הפגומות לקובץ .sql, למשל דרך phpMyAdmin או mysqldump --default-character-set=utf8mb4.
  3. גררו את הקובץ לתיבה שלמעלה. Mojibuster מתקן רק את המקומות הפגומים ומראה כל שינוי.
  4. הורידו את הקובץ המתוקן וייבאו אותו עם utf8mb4 למסד בדיקה חדש.
  5. בדקו את האתר. אם הכול נראה תקין, ייבאו למסד החי.

הגיבוי לא מועלה לשום מקום. זה חשוב, כי בדרך כלל יש בו חשבונות משתמשים, כתובות דוא"ל ותגובות.

זהירות עם נתונים מסודרים (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 אותה בעיה ואותו פתרון.

מדריכים נוספים