הבלוג של גרי רשף

09/05/2010

משמעות השימוש ב-Collation ובחירה באופציה המתאימה

Filed under: Uncategorized — תגיות: — גרי רשף @ 07:30

יש ארבע אופציות ל-Collation עברי:

Hebrew_CI_AS

Hebrew_CS_AS

Hebrew_CI_AI

Hebrew_CS_AI

CI=Case Insensitive מציין שאינו רגיש להבדלים בין אותיות רגילות לסופיות (אותיות כמנפ"צ)

CS=Case Sensitive מציין שהוא רגיש להבדלים בין אותיות רגילות וסופיות (זה מה שאתה מחפש)

AI=Accent Insensitive מציין שאינו רגיש להבדלים בין אותיות לא מנוקדות למנוקדות (א=אֶ=אֳ)

AS=Accent Sensitive מציין שהוא רגיש להבדלים בין אותיות לא מנוקדות למנוקדות.

דוגמה:

ניצור דטבייס בעל Collation עברי כלשהו כדי שיוכל לתמוך באותיות עבריות (אחרת הן עלולות להיות מוצגות כסימני שאלה):

Use tempdb;

Go

If DB_ID('Tmp') Is Not Null Drop Database Tmp;

Go

Create Database Tmp Collate Hebrew_CS_AS;

Go

Use Tmp

Go

ניצור טבלה ונכניס לתוכה מספר מחרוזות שמתחילות באותיות 'תנ':

Create Table MyTbl(ID Int,Coteret Varchar(20));

Go

Insert Into MyTbl Values(1,'תן');

Insert Into MyTbl Values(2,'תנין');

Insert Into MyTbl Values(3,'תּן');

Insert Into MyTbl Values(4,'תַּן');

Insert Into MyTbl Values(5,'תנִין');

Insert Into MyTbl Values(6,'תנ');

Go

וכעת ננסה לשלוף ממנה שורות שהערכים בתוכן כוללים את המחרוזת 'תן',

כל פעם בעזרת Collation אחר:

Select * From MyTbl Where Coteret Collate Hebrew_CI_AI Like '%תן%' Collate Hebrew_CI_AI --1,2,3,4,5,6

Select * From MyTbl Where Coteret Collate Hebrew_CS_AI Like '%תן%' Collate Hebrew_CS_AI --1,3,4

Select * From MyTbl Where Coteret Collate Hebrew_CI_AS Like '%תן%' Collate Hebrew_CI_AS --1,2,6

Select * From MyTbl Where Coteret Collate Hebrew_CS_AS Like '%תן%' Collate Hebrew_CS_AS --1

לאחר כל שליפה כתוב אילו שורות ישלפו בעזרתה,

למשל בשליפה השניה – Hebrew_CS_AI – שמתייחסת להבדלים בין אותיות רגילות לסופיות אך מתעלמת מניקוד, נקבל את שורות 1,3,4 שמופיע בהן 'תן' – עם או בלי ניקוד.

מסקנה: מי שקולט טקסט בעברית לטבלאות שלו – יבחר בדרך כלל ב-Hebrew_CI_AI, בהנחה שהוא רוצה שחיפוש אחר שמות פרטיים המתחילם ב-'רמ' יחזיר גם את רם וגם את רמי;

ושאין שימוש בניקוד (זה המצב בדרך כלל).

כפי שציינתי, ה-Collation של בסיס הנתונים עליו הדגמתי הוא Hebrew_CS_AS במקרה זה, אך ניתן לבחור בכל Collation עברי והתוצאות לא ישתנו.

בכל מקרה המערכת תדע לשמור אותיות סופיות או מנוקדות, וה-Collation קובע אם היא תתייחס אליהן כזהות או לא.

האם צריך מעתה ואילך לציין Collate בכל שליפה הכוללת השוואה של מחרוזות?

כמובן שלא- ברירת המחדל תהיה ה-Collation של בסיס הנתונים, ורק אם מדובר בהשוואה שונה ומיוחדת יש לנהוג כך.

מה קורה אם נשווה מחרוזות בעלות Collation שונה? (למשל- לכל מחרוזת נגדיר Collation שונה על ידי פקודת Collate או נשווה נתונים משתי עמודות VarChar בעלות Collations שונים)

במקרה כזה נקבל הודעת שגיאה, כגון:

Cannot resolve the collation conflict between "Hebrew_CS_AS" and "Hebrew_CI_AI" in the like operation.

אין ברירה אלא ליצור להן מכנה משותף בצורת Collation זהה: או שבוחרים אחד בהתאם לנסיבות ומשתמשים בפקודת Collate,

או שפשוט קובעים את ה-collation של בסיס הנתונים בתור המכנה המשותף (Collate database_Default).

את ה-Collation של בסיס הנתונים ניתן לקבל, למשל, ככה:

Select collation_name From sys.databases Where database_id=DB_ID()

מה לגבי השימוש ב-NVarChar?

אם נגדיר את העמודה בטבלה בתור NVarChar (במקום VarChar)- התנהגות ברירת המחדל תהיה לפי ה-Collation של בסיס הנתונים,

אלא אם כן ננהג אחרת (כלומר- נבחר Collation באופן מפורש על ידי פקודת Collate).

מה קורה ב-Collations של שפות לועזיות?

באופן כללי האופציה של Case מגדירה אם יש הבדל בין אותיות Italic לאותיות Capital (במקרה של CI אין הבדל ובמקרה של CS יש הבדל);

והאופציה של Accent מגדירה אם יש הבדל בין a לבין á או בין u לבין ü וכו' (לא רלוונטי לאנגלית אלא לשפות אחרות, ובכל מקרה- AI אין הבדל AS יש הבדל).

בלוג בוורדפרס.קום.