מהן ערכות תווים ו־Collations ב־MySQL?
כאשר WordPress שומרת את תוכן האתר שלך במסד הנתונים (כמו פוסטים, כותרות, מחרוזות מתורגמות וכו'), היא משתמשת בערכת תווים (character set) כדי לייצג את התווים, וב־collation כדי להגדיר כיצד תווים אלה יושוו וימוינו.
- ערכת תווים (Charset)
- מגדירה כיצד תווים נשמרים במסד הנתונים — ביסודו של דבר, אילו בתים (bytes) מייצגים אילו תווים.
- Collation
- מגדיר את הכללים להשוואת התווים הללו (למשל, רגישות לאותיות רישיות, רגישות לסימני הגייה וסדר מיון).
למה זה חשוב לאתרים רב-לשוניים
WPML תומך בתוכן רב-לשוני, שלעתים קרובות כולל:
- תווים מיוחדים (למשל ñ, é, ö)
- כתב שאינו לטיני (למשל ערבית, יפנית, סינית, עברית)
- סמלי אמוג'י וסמלים אחרים (🎉, ✔️ וכו')
רבים מאלה דורשים יותר מ־3 בתים כדי להישמר כראוי. אם מסד הנתונים שלך משתמש ב־collation לא תואם, תווים עלולים ללכת לאיבוד, להיות מוחלפים ב־�, או לגרום לשגיאות במסד הנתונים (למשל, "Incorrect string value").
לכן אנו ממליצים בחום להשתמש ב־collation שתומך בתווי Unicode של 4 בתים.
ההמלצה שלנו
השתמשו בערכת התווים utf8mb4 וב־collation תואם Unicode, כגון:
- utf8mb4_unicode_ci – תאימות רחבה, ברירת מחדל טובה
- utf8mb4_unicode_520_ci – טיפול טוב יותר ב־Unicode ב־MySQL 5.6 ומעלה
- utf8mb4_general_ci – מהיר מעט יותר, השוואת Unicode פחות מדויקת
- utf8mb4_bin – רגיש לאותיות רישיות ולסימני הגייה (השוואה בינארית)
כולם בטוחים לשימוש עם WPML.
חשוב: ערכת התווים הישנה utf8 ב־MySQL תומכת בעד 3 בתים לכל תו בלבד. היא אינה יכולה לטפל בחלק מהתווים, כמו אמוג'י או אידיאוגרמות מסוימות. הימנע משימוש בה עבור תוכן רב-לשוני.
מהי ברירת המחדל ב־MySQL?
| גרסת MySQL | ערכת תווים כברירת מחדל | Collation כברירת מחדל | תואם Unicode |
|---|---|---|---|
| < 5.5 | latin1 | latin1_swedish_ci | לא |
| 5.5.x | utf8 | utf8_general_ci | לא |
| 5.7+ | utf8mb4 | utf8mb4_general_ci / utf8mb4_unicode_ci | כן |
| 8.0+ | utf8mb4 | utf8mb4_0900_ai_ci | כן |
WordPress לא תמיד עוקבת אחר ברירת המחדל של MySQL — היא יכולה לדרוס אותה באמצעות תצורה או העברות (migrations).
הגדרת ערכת תווים ו־Collation לאתרים חדשים
כדי להבטיח ש־WordPress תיצור טבלאות חדשות עם ערכת התווים וה־collation הנכונים, הגדר את הערכים הבאים בקובץ wp-config.php שלך:
define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4 define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
זה יחול על התקנות חדשות ועל טבלאות שנוצרו לאחרונה.
בדיקת ערכת תווים ו־Collation לאתרים וטבלאות קיימים
כך תוכל לבדוק את ערכת התווים וה־collation באתרים הקיימים שלך.
אפשרות 1 phpMyAdmin
- עבור אל מסד הנתונים של האתר שלך.
- בדקו את העמודה "Collation" לצד כל טבלה.
- לחצו על טבלה כדי לראות את ה־collation הפרטני של כל עמודה.
אפשרות 2 WP-CLI
bash
wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"
תוכלו גם לבדוק עמודות פרטניות:
bash
wp db query "SHOW FULL COLUMNS FROM wp_posts;"
אם אתה רואה שה־collation מתחיל ב־utf8mb4_, אז הוא מוכן לתמוך בכל סוגי ה־Unicode ואידיאוגרמות של 4 בתים. גם ערכת התווים תקינה.
אם אתה רואה משהו אחר, לדוגמה utf8_*, עליך לשנות זאת.
שים לב שה־collation יכול להיות שונה מעמודה לעמודה.
עדכון ערכת תווים ו־Collation לטבלאות ועמודות קיימות
עדכון הקבועים DB_CHARSET ו־DB_COLLATE בקובץ wp-config.php שלך משפיע רק על טבלאות חדשות. כדי להחיל שינויים על טבלאות ועמודות קיימות, עליך להמיר אותן ידנית באמצעות SQL.
אנו ממליצים גם לעדכן את ה־collation כברירת מחדל של MySQL במסד הנתונים באמצעות הפקודה הבאה:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
התחל תמיד בגיבוי
לפני הפעלת שאילתות המרה כלשהן:
- ייצאו את מסד הנתונים שלכם באמצעות phpMyAdmin או mysqldump
- שמרו אותו במקום בטוח למקרה שמשהו ישתבש
אזהרה: עדכוני Collation עלולים להיכשל במצב Strict
בעת עדכון ה־collation של טבלה שלמה (או מסד נתונים), MySQL עשויה לבנות מחדש טבלאות ולאמת מחדש את כל ערכי ברירת המחדל של העמודות — כולל עמודות שאינן קשורות כמו DATETIME. אם מסד הנתונים שלך פועל במצב strict של SQL (STRICT_TRANS_TABLES, NO_ZERO_DATE), עמודות עם ערכי ברירת מחדל כמו "0000-00-00 00:00:00" יפעילו שגיאות כגון:
#1067 - Invalid default value.
מהו מצב Strict?
מצב Strict שולט באופן שבו MySQL מטפל בערכים לא חוקיים או חסרים כאשר נתונים מתווספים או מתעדכנים במסד הנתונים. ערך יכול להיות לא חוקי מכמה סיבות. לדוגמה, ייתכן שיש לו סוג נתונים שגוי עבור העמודה, או שהוא עשוי להיות מחוץ לטווח.
תוכל למצוא מידע על הסוגים השונים של אימות נתונים עבור מצב Strict בתיעוד של MySQL.
כיצד מצב Strict משפיע על מסד נתונים של אתר WordPress
כברירת מחדל, WordPress משתמשת בערך "0000-00-00 00:00:00" כברירת מחדל עבור חלק מעמודות datetime, דבר שאינו מתקבל על ידי מצב strict מסוג NO_ZERO_DATE.
שים לב שערכי ברירת מחדל אלה הותרו במהלך יצירת הטבלה המקורית (למשל, במהלך הגדרת WordPress), אך נכשלים בפעולות ALTER בסביבות strict.
כיצד לבדוק אם מצב Strict מופעל
הפעילו את הפקודה הבאה:
SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;
חפש את:
- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_DATE
אם אתם מוצאים אחד מאלה, מצב strict מופעל.
כדי למנוע שגיאות במהלך עדכוני ערכת תווים ו־collation, עליכם להשבית רק את מצב strict מסוג NO_ZERO_DATE.
כיצד להמשיך בבטחה
בצע אחת מהפעולות הבאות כדי להמשיך בבטחה:
1. הימנע משינוי עמודות וטבלאות אלא אם כן ה־collation באמת דורש שינוי.
2. השבת זמנית את מצב strict עבור ה־session בלבד בזמן הפעלת שאילתות המרה. תוכל לעשות זאת באמצעות הפקודה הבאה:
SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');
הערה: ישנן תוכניות עתידיות ל־MySQL למזג מצבי strict.
במקרה של בעיות אחרות הייחודיות לנתונים שלכם, ייתכן שתרצו להשבית כל מצב strict באמצעות הפקודה הבאה:
SET SESSION sql_mode = '';
שאילתות להמרת נתונים
המרת מסד הנתונים כולו
הפקודה הבאה מייצרת שאילתת ALTER TABLE עבור כל טבלה במסד הנתונים שלכם:
SELECT CONCAT( 'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) AS query FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name';
הפעילו את השאילתות המתקבלות ב־phpMyAdmin, או העתק והדבק לתוך MySQL CLI / WP-CLI.
פעולה זו מבטיחה שכל הטבלאות במסד הנתונים שלכם יאמצו את ערכת התווים וה־collation החדשים.
המרת טבלה ספציפית אופציונלי/נוסף
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
פעולה זו מעדכנת את כל עמודות הטקסט בטבלה wp_posts לשימוש ב־utf8mb4 וב־collation שצוין.
המרת עמודה ספציפית אופציונלי/נוסף
ALTER TABLE wp_posts CHANGE post_title post_title TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
הערה:
- עליכם להכריז מחדש באופן מלא על העמודה (סוג, שם) ב־CHANGE.
- ודאו שסוג העמודה תואם לסוג הקיים.
שגיאות נפוצות בעת המרה
להלן שתי שגיאות נפוצות שאתם עשויים להיתקל בהן בעת המרת טבלאות ועמודות.
חוסר התאמה בין ערכת תווים ל־Collation
-- INVALID: utf8 collation with utf8mb4 charset ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci; -- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
פתרון:
- השתמשו ב־collation תואם: utf8mb4_*
מגבלת אורך מפתח אינדקס
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
בתצורות מסוימות, במיוחד עבור גרסאות MySQL מתחת ל־5.7, ייתכן שתהיה חריגה מהאורך המרבי של מפתח אינדקס בעת הוספת בית אחד נוסף לכל תו.
פתרון:
- קצר VARCHAR(255) שנוסף לאינדקס ל־VARCHAR(191) במידת הצורך
- או שדרג ל־MySQL 5.7 ומעלה וודא ש־innodb_large_prefix מופעל
סיכום
- השתמש בערכת התווים utf8mb4 לתמיכה מלאה ב־Unicode
- השתמשו ב־collations תואמים: utf8mb4_unicode_ci, utf8mb4_0900_ai_ci וכו'
- עדכן את wp-config.php עבור טבלאות חדשות
- הפעל העברות (migrations) של SQL כדי לתקן טבלאות קיימות
- לעולם אל תערבב ערכות תווים ו־collations — מערכת MySQL תדחה או תשבור אותם.