טכני – באיזה בסיס סופרים בסיסי נתונים

דבר ראשון – פתחתי קטגוריה חדשה. קראתי לה “שחרור קיטור טכני”. בקטגוריה הזו אני שם כל פוסט שהוא דיון טכני על דברים מעצבנים שאני נתקל בהם במהלך עבודתי השוטפת. אם אתם לא מעונינים בפרטים טכניים מעיקים – אתם יכולים לסנן את הרשימות האילו ללא חשש.

את יום שישי הקדשתי לבחור הזה, שהיה צריך שאני אוסיף תמיכה בסוג משתנה חדש. המשתנה “numeric” פירושו מספר בעל דיוק גבוה כרצונכם. בעודי עובד על לתרגם את הצורה בה PostgreSQL מייצג את המספר לצורה שבה מיקרוסופט מצפים לקבל את המספר, התגלו לי כמה עובדות משעשעות (או משעשעות פחות).

1. PostgreSQL שומר את הנתונים בוריאציה על בסיס, שהדחקתי את קיומו, שנקרא “BCD”. לא בדיוק בינארי, לא בדיוק עשרוני. הרעיון (המעוות) הוא שאתם שומרים כל כמה ספרות עשרוניות בבינארי. התוצאה היא שכדי לתרגם את הסיפור הזה לבינארי רגיל, צריך להתחיל לעשות פעולות כפל וחילוק. כבר ציינתי שהמספרים הם בעלי דיוק מוחלט? הייתי צריך להתחיל לממש כפל ארוך בתוכנה. גרר.
2. את הנתונים לגבי איפה המספר נמצא (אקספוננט), הוא שומר בבסיס עשרוני. אני מניח שזה הגיוני, לאור זה שככה גם המספר עצמו נשמר.
3. OLE DB של מיקרוסופט, מצד שני, שומר את הנתונים בבינארי רגיל. מצויין!
4. את הנתונים על איפה על איפה המספר נמצא (אקספוננט) הוא שומר בעשרוני!! מה???

התוצר הסופי כולל תרגום ממספר עשרוני של 39 ספרות למספר בינארי של 39 ספרות עשרוניות, חישוב כמה ספרות עשרוניות זה הספרות הבינאריות, ושאר דברים טובים. נו טוב – מי אמר שתיכנות זה דבר קל?

שחר

מאת

שחר שמש

מייסד–שותף וחבר ועד בתנועה לזכויות דיגיטליות מייסד שותף בעמותת „המקור”. פעיל קוד פתוח. מפתח שפת התכנות Practical

3 תגובות בנושא “טכני – באיזה בסיס סופרים בסיסי נתונים”

  1. I thought that the data types have been standardized by the 92 sql standard
    I can see why specific types will vary but binaries? they should be totatly regular!

    1. שאלה מעניינית. אני מניח שכל אחד עושה מה שנוח לו. התקן מגדיר מה numeric צריך לדעת לעשות, לא איך הוא עושה את זה. PostgreSQL מממש את התקן בצורה אחת, ולכן נוח לו לייצג את הנתונים ב-BCD. מצד שני, OLEDB לא מממש שום דבר – זה רק ממשק בין תוכנות. או שהם פשוט בחרו משהו שנראה להם הגיוני (ואז זה מפחיד שזה מה שנראה להם הגיוני), או שהם בחרו את מה ש- SQL Server עושה באופן פנימי (מה שאומר שזה מה שנראה ל- SQL Server הגיוני!). ככה או ככה, צריך לשאול מה הם חשבו לעצמם.

      הרעיון מאחורי דרייבר כמו OLE DB זה להטיל את העבודה של להביא את כולם לאותו סטנדרט על כותב הדרייבר (במקרה זה, אני), ולא על מי שרק רוצה להשתמש במערכת. מחשבה הגיונית, בסופו של דבר. זה כן אומר שאני עובד יותר קשה.

סגור לתגובות.