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

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 יש הבדל).

מודעות פרסומת

6 תגובות »

  1. לא מדויק, אם רוצים להתגבר על הבעיה של השוואת מחרוזות בקידוד שונה אפשר להמיר את המחרוזות ל-VARBINARY ולבצע את ההשוואה [זה מקביל לפונקציה DUMP ב-ORACLE]

    תגובה של נמרוד — 29/01/2017 @ 17:02

  2. רשימת collation בעברית היא קצת יותר מ 4 🙂
    היא עולה על חמישים אפשרויות
    SELECT * FROM sys.fn_helpcollations()
    where name like '%heb%'
    GO

    תגובה של Ronen — 02/10/2014 @ 19:59

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

    הממ – לא התכוונת באין אותיות LOWER CASE ל UPPER CASE (CAPITAL(??

    תגובה של Mike Golan — 16/09/2012 @ 13:06

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

      תגובה של גרי רשף — 16/09/2012 @ 15:39

      • Italics מתייחס לאותיות שכתובות באופן "מוטה", זה ענין של פונט ולא של תוים.

        תגובה של Mike Golan — 16/09/2012 @ 22:08

        • בדקתי, וכנראה שהצדק עמך.
          תודה על התיקון.

          תגובה של גרי רשף — 16/09/2012 @ 22:35


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

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

%d בלוגרים אהבו את זה: