נושא הקידוד בבסיסי נתונים יכול לגרום להרבה עצבים ואינספור שעות עבודה. אני מנסה כאן לרכז את המסקנות שהגעתי אליהן בנושא
קודם כל צריך להפריד בין שני מושגים מבלבלים: character set ו collation:
Character set – הוא הדרך שבו בסיס הנתונים שומר פיזית את הנתונים. כמה ביטים הוא מקצה לכל תו ואיך הוא מאחסן תווים מיוחדים.
Collation – אוסף הכללים לאיך לגשת לנתון. איך למיין ולחפש.
לדוגמא:
נניח שיש לנו שפה עם ארבע אותיות: 'A', 'B', 'a', 'b'.
נתן לכל אות ערך: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3'.
'A' היא התצוגה, 0 הוא הקידוד ל'A'. והשילוב בין התצוגה לקידוד של כל ארבעת האותיות הוא ה character set.
עכשו נניח שאנחנו רוצים למיין את המילים שמכילים את האותיות הנ"ל. השיטה הכי קלה למיון היא לפי הקידוד. כלומר אם A=0 ו B=1. אזי המילים שמתחילות ב A יבואו לפני המילים שמתחילות בB.
כאן הגדרנו Collation. כלומר, חוק שמגדיר איך למיין. החוק אומר שיש למיין לפי הערך של הקידוד. לCollation הזה נוכל להוסיף חוקים נוספים. למשל החוק שאומר שאין הבדל בין אותיות קטנות וגדולות במיון.
כלומר, לCollation שהגדרנו יהיו 2 חוקים:
א. אותיות קטנות זהות לאותיות גדולות (A=a, B=b)
ב. סדר האותיות יהיה לפי ערך הקידוד.
הגדרנו כאן סוג של case-insensitive collation. כלומר, סדר מיון שאינו מבחין בין אותיות קטנות לגדולות. כאשר בוחרים collation לבסיס נתונים /טבלה חדשה, כל collation שמסתיים בci הוא מהסוג הנ"ל.
אקסנטים הוא נושא לא פשוט במידה ואנחנו רוצים לקבל תוצאות שונות עבור מילה עם אקסנט ומילה בלי. ברוב הcollation אין הבחנה בין אות עם אקסנט לבין אות בלי.
לדוגמא, אם יש לי שדה uniqe עם המילה 'Alamuš' ואנחנו רוצים להוסיף את המילה 'Alamus', נקבל הודעת שגיאה שהמילה קיימת כבר. זה קורה בגלל ששאילתות מול בסיס הנתונים מתבצעות לפי חוקי הcollation שהוגדרו.
כדי למנוע בעיות מהסוג הזה, יש להגדיר collation שידע להבין בין אקסנטים – accents שמופיעים בשפות שונות כמו צרפתית, הcollation היחיד שמתאים הוא: utf8_bin.
במידה ואנחנו רוצים לשנות טבלה שכבר קיימת עם נתונים שכבר קיימים, יש להריץ את הפקודה הבאה:
ALTER TABLE [table name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin