התנהגות המערכת בהגדרת ה-Collation

03/03/2011

3 תגובות

ה-Collation מגדיר את השפות והמאפיינים בהן המערכת תומכת.
בארץ למשל מקובל להשתמש ב-Hebrew_CI_AS שמאפשר כתיבה בעברית ובאנגלית, אי רגישות של המערכת להבדלים בין אותיות רגילות לסופיות (בעברית) ובין קטנות לגדולות (בלועזית), ורגישות לאותיות מנוקדות (בעברית).
אי רגישות בין אותיות רגילות לסופיות פירושה שמבחינת המערכת מ=ם או פ=ף לצורך השוואה, אך כמובן שהאותיות נשמרות כאותיות שונות.

בעת התקנת SQL Server נקבע ה-Collation של השרת שהוא יהיה ה-Collation של הדטבייסים של המערכת, וכן Collation ברירת המחדל של הדטבייסים שיווצרו בהמשך (אם לא יוגדר להם במפורש אחד אחר):

clip_image002

(בצילום המסך שתי דרכים למצוא מה ה-Collation של השרת)

שינוי ה-Collation של השרת הוא פעולה די רגישה שבונה מחדש את הדטבייסים של המערכת וכוללת Restart של השרת, כך שעדיף לא לנסות על שרת הייצור..

כשיוצרים דטבייס חדש – ה-Collation שלו יהיה זה של השרת אלא אם כן נאמר אחרת, למשל כך:

Create Database MyDB Collate Hebrew_CI_AI;

Go

וניתן למצוא את ה-Collation של הדטבייס באחת מהדרכים הבאות:

Select DatabasePropertyEx('master','Collation');

Select DatabasePropertyEx(DB_Name(),'Collation');

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

clip_image004

כשיוצרים טבלה ובה עמודות טקסט Char/NChar/VarChar/NVarChar ה-Collation שלהן יהיה כשל הדטבייס אלא אם כן הוגדר אחרת. כדאי לציין שלטבלה עצמה אין Collation למרות שעיון ב-Properties שלה יוצר מצג שווא כאילו כן:

clip_image006

טעות שנתקלתי בה: ניסו לברר כיצד זה שיצר את הטבלה או את הדטבייס התייחס ל-Collation על ידי יצירה של סקריפט של האובייקט:

clip_image008

הסקריפט לא כלל התייחסות ל-Collation ולא מפני שמי שיצר אותו לא התייחס לנושא וסמך על ברירת המחדל, אלא מפני שבהגדרות המערכת של ה-SSMS לא ציינו שאנחנו מעוניינים לכלול בסקריפט גם את ה-Collation:

clip_image010

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

בכל מקרה- את ה-Collation של הדטבייס או של העמודה ניתן לשנות בקלות על ידי פקודת Alter Database או Alter Table מתאימה,

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

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

3 תגובות

  1. אלי22/02/2016 ב 02:46

    אשמח אם תענה לי על השאלה הבאה
    יש לי טבלה עם מילים מנוקדות
    אני רוצה להציג רק מילים שמכילות את התנועה פתח שהקוד שלו הוא 1463
    אני כותב
    DECLARE @d NCHAR
    set @d = NCHAR(1463)
    select * from words where word like '%' + @d + '%'

    כל הרשומות מופיעות גם אלה שאין בהם פתח

    כשאני בוחר קוד של אות הסינון עובד מצויין
    Collate of db = Hebrew_cs_as
    זה לא עובד גם שבסיום הפקודה אני רושם את כל סוגי הקולטים העבריים
    תודה מראש

    הגב
    1. גרי רשף22/02/2016 ב 13:33

      לא הצלחתי..
      מה שכן, יש פתרונות חלופיים.

      אחד עם NVarchar:
      If Object_ID('words','U') Is Not Null Drop Table words;
      Create Table words(word NVarchar(20));
      Insert
      Into words
      Values (N'אבָג'),
      (N'אבַג'),
      (N'אבַּג'),
      (N'אבָּג'),
      (N'אבג');

      Select *
      From words
      Where PatIndex(N'%[בַּגַּדַּכַּפַּתַּבַגַדַכַפַתַ]%',word)0

      שני עם Varchar:
      Use master;
      Go

      If DB_ID('TryCollate') Is Not Null
      Drop Database TryCollate;
      Go

      Create Database TryCollate Collate Hebrew_CS_AS;
      Go

      Use TryCollate;
      Go

      If Object_ID('words','U') Is Not Null Drop Table words;
      Create Table words(word Varchar(20));
      Insert
      Into words
      Values ('אבָג'),
      ('אבַג'),
      ('אבַּג'),
      ('אבָּג'),
      ('אבג');

      Select *
      From words
      Where PatIndex('%[בַּגַּדַּכַּפַּתַּבַגַדַכַפַתַ]%',word)0

      זה מחייב לכתוב בתנאי את כל האפשרויות (אני הסתפקתי באותיות בג"ד כפ"ת).

      הגב
      1. גרי רשף22/02/2016 ב 16:55

        בבדיקה חוזרת כן הצלחתי, אך עם Collation מסוג Bin:

        If Object_ID('words','U') Is Not Null Drop Table words;
        Create Table words(word Varchar(20) Collate Hebrew_100_BIN);
        Truncate Table words;
        Insert
        Into words
        Values (N'אבָג'),
        (N'אבַג'),
        (N'אבַּג'),
        (N'אבָּג'),
        (N'אבג');

        Declare @d NChar=NChar(1463);
        Select *
        From words
        Where word Like '%'+@d+'%';

        הגב