סוגי שדות (Columns) במאגר נתונים MySQL

‏ • 15 במאי, 2006

פתיחה

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

סוגי השדות המצויינים כאן הם של MySQL 4.1 ומעלה, בד"כ יש שוני משמעותי בין סוגי שרתי Database. כמו-כן, יש מספר שדות חדשים בגרסת MySQL 5.

כתבה זאת תעסוק רק בסוגי השדות הבסיסיים. לכל שדה יש אפשרויות הגדרה נוספות, כמו הגדרת קידוד לטקסט (UTF8, hebrew), שחשובה מאוד בגרסאות האחרונות של MySQL.
כמו כן, על מנת לקבל מידע שלם ומפורט אפשר להכנס לתיעוד הרשמי של MYSQL. התיעוד כולל פירוט נרחב של האופציות הנוספות שיש להגדיר יחד עם הבחירה של סוגי השדה, כמו תוכן אפסי (NULL), מספר UNSIGNED או SIGNED ועוד.

MySQL כולל מספר סוגי שדות, המתחלקים לשלושה קבוצות:

  • שדות מספריים – שלמים או שדות מספריים – לא שלמים
  • שדות תאריך וזמן

  • שדות טקסט

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


    שדות מספריים (שלמים)

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


























































    סוגBytesערך מינימליערך מקסימלי
    TINYINT1-128127
    TINYINT UNSIGNED10255
    SMALLINT2-3276832767
    SMALLINT UNSIGNED2065535
    MEDIUMINT2-83886088388607
    MEDIUMINT UNSIGNED3016777215
    INT4-21474836482147483647
    INT UNSIGNED404294967295
    BIGINT4-92233720368547758089223372036854775807
    BIGINT UNSIGNED4018446744073709551615


  • חשוב לבחור את סוג השדה בהתאם לתוכן שלה. ככל שתקחו סוג שדה עם טווח גדול יותר, ככה יגדל הנפח של מאגר הנתונים וזמן השאילתות יגדל.
  • כדאי בהרבה מקרים להוסיף את הגדרת UNSIGNED. הגדרה זאת לא מאפשרת להכניס ערכים שליליים (מתחת לאפס) ובכך מכפילה את טווח המספרים.

    שימוש חשוב בשדה מספרית הוא מפתח ראשי לכל טבלה. מספור זה ממספר את עצמו אוטומטית.







    1
    2
    3
    4
    5
    6
    7  




    CREATE TABLE `articles` ( `articleId` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT , `name` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `articleId` ) ); INSERT INTO `articles` (`name` ) VALUES ('First Article'); 



  • כדאי להשתמש בהגדרת UNSIGNED, כי בכל מקרה המספור האוטומטי מתחיל מ- 1.
  • בעיקרון לא צריך להתעסק עם השדה articleId. מאגר הנתונים יציב אוטומטית בשדה articleId את המספר הבא בתור. אפילו אם יהיו "חורים" בין המספרים, זה לא קריטי לשום דבר.

    שדות מספריים (לא שלמים)

    יש רק שני סוגים של מספרים לא שלמים. ההבדל בניהם הוא רמת הדיוק של המספר אחרי הנקודה העשרונית.


  • FLOAT – שדה עם דיוק נמוך יותר
  • DOUBLE – שדה עם רמת דיוק גבוהה

    דוגמאות







    1
    2
    3
    4  




    ALTER TABLE `articles` ADD `score1` FLOAT NULL ;ALTER TABLE `articles` ADD `score2` DOUBLE NULL ;INSERT INTO `articles` (`name` , `score1` , `score2` ) VALUES ('Second Articles', '1234.1234', '1234.1234');


  • הכנסת 1234.1234 לשדה score1 יישמר 1234.12
  • הכנסת 1234.1234 לשדה score2 יישמר בערכו המלא

    שדות תאריך וזמן

    עמודת DATE
    מאפשרת לשמור תאריך (יום, חודש, שנה). הייצוג הפנימי של התאריך הוא הפוך.






    1
    2
    3  




    ALTER TABLE `articles` ADD `date` DATE NOT NULL ;INSERT INTO `articles` (`date`) VALUES ('2005-03-21');


  • התבנית המועדפת על MySQL היא YYYY-MM-DD. ניתן להשתמש בתבניות אחרות, אבל אם MySQL ייתקל בתבניות לא מוכרות, התאריך יאופס אל 0000-00-00.
  • ניתן להכניס שנה מקוצרת בעלת 2 תווים בלבד, וזה עדיין ייחשב כתבנית רגילה.

    עמודת TIME
    מאפשרת לשמור זמן (שעה, דקה, שנייה). התבנית המועדפת להכנסת נתונים היא HH:MM:SS. כמו כן, צריך לזכור שהזמן יישמר בתבנית 24 שעות, אז אם מישהו מכניס 2:30 בצהריים, אז ייחשב שעת בוקר אם לא הופכים את זה לפורמט 24H.






    1
    2
    3  




    ALTER TABLE `articles` ADD `date` TIME NOT NULL ;INSERT INTO `articles` (`date`) VALUES ('16:30:00');


  • 4:30 אחה"צ יישמר כך: 16:30:00

    עמודת DATETIME
    שדה זאת כוללת תאריך וזמן ביחד, כאשר שני סימני רווח מפרידים בין התאריך לזמן. התבנית היא צירוף של התבניות הקודמות YYYY-MM-DD HH:MM:SS.






    1
    2
    3  




    ALTER TABLE `articles` ADD `date` DATETIME NOT NULL ;INSERT INTO `articles` (`date`) VALUES ('2005-03-21 16:30:00');


  • 21/3/2005 4:30 אחה"צ יישמר כך : 2005-03-21 16:30:00.

  • אפשר להכניס לשדה זה רק תאריך ללא זמן.

    עמודת YEAR
    מאפשרת לשמור שנה בלבד. טווח: 1901 עד 2155

    עמודת TIMESTAMP
    מאפשרת לשמור "חותמת תאריך" בתבנית UNIX.
    אני משתמש בשדה DATETIME, כי נוח להשתמש בשאיתות דרך phpMyAdmin בעזרת השדה DATETIME.

    שדות טקסט

    עמודת VARCHAR
    בשדה זאת אפשר לשמור טקסט עד 255 תווים.






    1
    2
    3  




    ALTER TABLE `articles` ADD `writer` VARCHAR(5) DEFAULT 'None' NOT NULL;INSERT INTO `articles` (`writer`) VALUES ('ABCDE 12345 ABCDE');


  • הכנסה עודפת של תווים מעבר לגודל השדה, תקצץ את התווים העודפים. בדוגמא כאן, יישמר הטקסט ABCDE בלבד, כי גודל השדה הוא 5 תווים בלבד.

  • אפשר להכניס ערך ברירת מחדל, כמו None. ערך זה ייכנס בשדות ללא ערך.

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

    שדות BINARY, VARBINARY
    אותו גודל והתנהגות כמו VARCHAR, אבל שדות אלו שומרות טקסט בצורה בינארית. זאת אומרת, שאין לשדות הגדרת קידוד והמיון שלהם נעשה לפי הערך המספרי של התווים.

    שדות TEXT
    שדות אלו מאפשרות לשמור קטעי טקסט גדולים.


















    סוגגודל
    TINYTEXTעד 255 תווים
    TEXTעד 65,553 תווים
    MEDIUMTEXTעד 16,777,215 תווים
    LONGTEXTעד 4,294,967,295 תווים


  • גודל עמודת LONGTEXT משתנה משרת לשרת, אבל אפשר להכניס די הרבה טקסט לשדה כזאת.

  • שימו לב לגדלים המירביים של כל שדה. MEDIUMTEXT אמור להספיק לכל דבר.

    שדות BLOB
    אותו גודל והתנהגות כמו שדות TEXT, אבל שמירת הטקסט יהיה בצורה בינארית.
    אפשר להשתמש בשדה זה לאחסון קבצים כמו תמונות ומסמכים.

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






    1
    2
    3  




    ALTER TABLE `articles` ADD `category` ENUM( 'cat1', 'cat2', 'cat3' ) NOT NULL ;INSERT INTO `articles` (`category`) VALUES ('cat2');


  • הכנסת ערך שלא נמצא ברשימה יגרום לשגיאה בשאילתה.

    עמודת SET
    דומה מאוד אל ENUM, אבל מאפשרת לשמור מספר ערכים.






    1
    2
    3  




    ALTER TABLE `articles` ADD `categories` SET( 'cat1', 'cat2', 'cat3' ) NOT NULL ;INSERT INTO `articles` (`categories`) VALUES ('cat2,cat3');

    זהו!
    תזכרו שזה חשוב להשתמש בשדות מתאימים. מאגר נתונים מבזבז משאבים של השרת מהר מאוד אם לא משתמשים בו כראוי.
    אם הגדרתם שדה קטן מדיי, תמיד תוכלו לשנות אותו ע"י שאילתת ALTER בלי לאבד נתונים.

    על המחבר:
    הדר פורת הוא מתכנת חברת Keynetik המספקת שירותי בניית אתרי אינטרנט ופיתוח תוכנות לסביבת האינטרנט בטכנולגיות מתקדמות, כולל PHP5, AJAX, מאגרי נתונים וכדומה.


  • תגיות: , ,

    תגובות בפייסבוק