none
בעיית עברית בטעינת נתונים מ-SQL Server אל - Oracle דרך SSIS

    שאלה

  • בזמן טעינת נתונים לסביבת ORACLE משתמשי ORACLE מזהים עברית כ-ג'יבריש.

    אנחנו משתמשים ב-MSSQL 2012. כדי למקד את הבעיה ביצעתי טעינה ישירה דרך Linked Server (ללא SSIS) - המצב לא השתנה.

    ה-COLLATION של השרת שלנו הוא HEBREW_CI_AS. בשיחה עם צד השני (ORACLE) מתברר שה- nls_lang שלהם (שזה כמו COLLATION של השרת) הוא AMERICAN_AMERICA.WE8ISO8859P1 וכדי לטעון נתונים לטבלאות שלהם הם עושים האמרה של nls_lang ל - HEBREW_ISRAEL.WE8DEC. בניסיוני למצאו COLLATION המקביל לזה של ORACLE ב-MSSQL לא נתן כלום. אין באפשרותנו לשחק עם COLLATION של השרת מסיבה שבמקביל רצים תהליכים נוספים. כדי לבדוק את כל האופציות בצעתי טעינה של שורה אחת עם כל ה-COLLATION האפשריים (sys.fn_HelpCollations()) אך עבור כל האפשרויות עברית נטענה בצורה לא תקינה.

    האם מישהו ניתקל בבעיה כזאת?

    יום חמישי 21 דצמבר 2017 11:32

כל התגובות

  • ערב טוב,

    אני חושב שאולי יש בלבול קטן בהבנת המושג collation והמשמעות שלו על המידע תחת סוגי נתונים שונים.

    ה collation קובע בעיקר את החוקיות של עבודה עם המידע, כמו למשל כיצד למיין את המידע או כיצד מבוצעות השוואות של הנתונים. שימוש במיון בעזרת order by יכול להוביל לתוצאות שונות למשל בעבודה עם collation שונים אבל אם המידע נשמר כ Unicode אז הוא בדיוק אותו מידע במסד הנתונים בלי קשר ל collation בו אתה עובד. מה שחשוב לך זה ה encoding של המידע (בבלוג בקישור המצורף תוכל לקבל קצת הבנה על ההבדל בין המושגים).

    * ה collation כן משפיע בצורה עקיפה על המידע הנשמר כאסקי (למשל Char או Varchar) מכיוון שבשרתי SQL הוא קובע את ה code page של המידע ז"א משפיע על הקידוד (encoding) בטורים שאינם יוניקוד.

    * דרך אגב בחירת ה collation יכולה להשפיע בצורה משמעותית על הביצועים במקרים מסויימים ולא רק על התוצאות של השאילתה.

    אני ממליץ בחום לקרוא את הבלוג הקצר הבא ומדריך הבא:
    http://ariely.info/Blog/tabid/83/EntryId/179/character-set-character-code-point-and-character-encoding.aspx
    https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support
    וזהו קישור מהצג של אורקל לנושא:
    https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch2charset.htm

    אם נחזור לבעיה שמולך, אז הרי מה שחשוב זה ה encoding וכדי לעבוד בצורה נוחה עם עברית ושפות נוספות מומלץ לוודא שאתה עובד עם Unicode, למשל טורים מסוג NVARCHAR או NCHAR. כאמור אין משמעות ל Collation במקרה כזה מכיוון שטורים מסוג יוניקוד מקודדים באותה צורה בעזרת קידודד UCS-2 בשרתי SQL.

    לאורקל יש קידודים שונים מאלו של שרתי SQL ותלות שונה ב collation. תיאורטית, כל מה שאתה צריך לוודא זה שאתה עובד עם פרוביידר מתאים לאורקל (זה יבצע עבורך את הקריאה של הנתונים בצורה מתאימה וכמובן פרוביידר מתאים עבור SQL בזמן הכתיבה. אתה צריך לראות שאתה מקבל את הנתונים בצורה קריאה ולהכניס אותן לטור מסוג unicode בשרת ה SQL.בשרת ה אורקל תוודא שאתה עובד עם קידוד ISO 8859-8.

    לצערי אין לי כרגע שום שרת אורקל נגיש כדי לבצע בדיקות. אני מקווה שהקישורים וההסבר הקצר כאן יובילו אותך לפתרון

    * Off-Topic דרך אגב, העברתי כמה הרצאות ממתקדמות בנושא SQL Server Internals בהם הראיתי כיצד המידע נשמר בפועל במסד הנתונים ברמה הבינארית, וכיצד אפשר לפתוח קובץ של שרתי SQL בעזרת תוכנת notepad ןלקרוא את המידע. יש ברשת מעט מידע בנושא אבל אם זה מעניין תוכל למצווא בעיקר בלוגים ישנים שכתב פאול רנדל כאשר הוא עוד עבד במייקרוסופט. באחת ההרצאות בנושא למשל באירוע הפתוח של sqlsaturday העלתי לרשת את הדמו המלא ואת המצגת שלי. זה נושא מתקדם אשר יכול לתת הבנה מלךאה אמיתי של מה קורה מאחורי הקלעים ולכן לתת לנו הבנה על ההשפעה לפני הקלעים :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]





    יום חמישי 21 דצמבר 2017 18:28
    מנחה דיון
  • בוקר טוב,

    תודה רבה על תגובתך. בנוגע ל-COLLATON כן היה לי בילבול קטן (אף פעם לא עבדתי מול אורקל).

    בכל מקרה אני כן משתמש בתוסף מיוחד עבור אורקל ל-SSIS אשר מייצר CONNECTION מסוג MSORA.

    ברצוני היה מלכתחילה לעבוד רק ביוניקוד אך הצד השני נוקשה לעבוד רק ב-varchar.

    אנסה לשכנע אותם לשנות אצלם. כי מבדיקתי אכן זה עבד ללא שום בעיה

    תודה רבה

    יום ראשון 24 דצמבר 2017 08:08
  • לא אמורה להיות בעיה כאשר עובדים נכון ובכל מקרה אתה לא יכול לשמור בקוד אסקי מידע של שפות רבות. מספר התווים של אסקי לא מאפשר להציג תווים בכל השפות ולכן אנחנו עובדים עם יוניקוד. סוגים של אסקי מאפשרים לשמור רק שפה בודדת תיאורטית

    * יש דרך לשמור שפות רבות אבל אז כל שורה צריך לפענח בקידוד שונה בזמן הקריאה ולא לקרוא ישירות

    אני שמח לשמוע שאתה בכיוון הנכון ויכולתי ממעט לעזור

    אנא זכור לסגור את השרשור :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]

    יום חמישי 28 דצמבר 2017 02:47
    מנחה דיון