על char וvarchar

בקטגוריה: טיפים והערות|כללי|מדריכי בנית אתרים

29 יולי 2010

סביר להניח שכל מי שאי פעם תכנן database נתקל בשני הטיפוסים char וvarchar, אך בואו ננסה להבין מה ההבדל ביניהם.

לכאורה, אם אשתמש בchar(32) או varchar(32) אוכל להכניס מידע באורך של עד 32 בייתים לכל שורה במסד בעמודה הזו.
אך מתחת לפני השטח הdatabase משתמש בשניים בצורה שונה.

המבנה של char פשוט יותר להסברה:
עבור ההצהרה char(X) בכל שורה יוקצו בדיוק X בייתים לאחסון. במידה ונכניס רק X – Y בייתים, יתווספו ברצף Y בייתים ובהם NULL.
המבנה של varchar טיפה יותר מורכב:
עבור ההצהרה varchar(X) בכל שורה יוקצו עד X + 1 בייתים לאחסון. במידה ויוכנסו Y בייתים, יתפסו Y + 1 בייתים בלבד, שהאחד הנוסף מכיל NULL המציין את סוף המידע.

מתי להשתמש במה:
כאשר הגודל הוא קבוע או כמעט כמובן שעדיף להשתמש בchar, הן פחות מקום יתפס ואם כל השורה היא fixed length (משמע מכילה רק טיפוסים באורך קבוע כמו מספרים, char, enum וכו') גם מעבר על שורות יהיה מהיר יותר.
כאשר הגודל משתנה מומלץ להשתמש בvarchar, כך נחסוך מקום באופן משמעותי.

מקווה שלמדתם משהו חדש!

9 תגובות לעל char וvarchar

סמלון

ספיר לפיד

29 יולי, 2010 בשעה 6:38

תודה רבה מאוד חשוב לדעת.
אבל אני רוצה להבין משהו, char זה משתנה של תו בודד נכון?
אז להשתמש בזה רק בתווים? איך יכול להיות תו בגודל לא קבוע?
(סליחה שאני מפציץ ככה בשאלות אבל אני באמת לא יודע את זה =S)

סמלון

Shay | Exalted Web

29 יולי, 2010 בשעה 11:11

אתה מדבר על משהו אחר לחלוטין שלא קשור בשום צורה.
אתה מדבר על char כטיפוס משתנה בשפות כמו C, אני מדבר עליהם במסדי נתונים כמו MySQL.

סמלון

ספיר לפיד

29 יולי, 2010 בשעה 17:01

ומה הם משמשים בבסיס נתונים? כטקסט?(אף פעם לא השתמשתי בזה)

סמלון

Shay | Exalted Web

29 יולי, 2010 בשעה 17:14

כן. הם משמשים כstring. אפשר להגיד שchar(X) מקביל בC לstring באורך X.
הvarchar הוא שונה מC ואין לו מקביל שם. אפשר להגיד שהוא קצת דומה לlist של אותיות, כל אות ואחריה האות הבאה עד שיש NULL.

סמלון

ספיר לפיד

29 יולי, 2010 בשעה 17:34

אה מגניב זה ממש כמו המחלקה LIST שמלמדים במדעי המחשב :)

סמלון

סרגיי מליך

29 יולי, 2010 בשעה 18:21

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

שי,
הערה מעולה כל הכבוד!
למרות שמעולם לא מצאתי שימוש סביר בCHAR, פרט לשמירת מספרי ת.ז.
אני אישית לא אוהב את ההגבלה הזו ומעדיף תמיד להשתמש בVARCHAR, למקרים חריגים [אפילו בת.ז. - מי שלדוגמא לא הכניס ספרת ביקורת]
השימוש בVARCHAR אמנם לוקח כמות "כבירה" של זיכרון מיותר, אבל פותחת בפני אפשרויות רבות להכנסת קלטים. לדעתי החופש הזה שווה את הבית הזה.
אולי במערכות גדולות זה לא מומלץ בגלל שעל כל 1000 רשומות, יהיה מגה בית מיותר, אבל במערכות קטנות זה תקף.

סמלון

Shay | Exalted Web

29 יולי, 2010 בשעה 22:24

נכון ולא נכון.
כמה שימושים לchar: שמירת סיסמה מוצפנת (md5 -> 32 וכדומה), עמודה שיכולה לקבל ערכים בגדלים מאוד מאוד קבועים (כמו key של config) וכו'.
אגב, על כל 1024 רשומות יהיה kilobyte יותר לא megabyte.
היתרון העיקרי והמשמעותי של char הוא שאם יש לי טבלה A שבנוייה לדוגמה מint וchar וטבלה B שבנוייה מint וvarchar, בשביל להגיע לשורה ה3000 בB אני אצטרך לעבור שורה שורה בגלל שאי אפשר לדעת איפה היא תיגמר, האורך של שורה בA הוא קבוע (fixed length) וחוסך את המעברים האלו.

תודה לכולכם על התגובות!

סמלון

סרגיי מליך

31 יולי, 2010 בשעה 21:53

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

אשמח אם תסביר את עצמך בעניין של המעברים בטבלאות A ו-B
האם אתה מתכוון שבעצם בשביל להגיע לשורה X עם VARCHAR זה יצטרך לעבור על כל הערכים עד שהוא יגיע לשורה X, לעומת CHAR שפשוט עושה מספר קפיצות X עד שהוא מגיע לערך הרצוי?

סמלון

Shay | Exalted Web

31 יולי, 2010 בשעה 21:56

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

טופס התגובה

קצת עלי

שמי שי ואני בונה אתרים וכיום חותך (מקודד) ומתכנת.
אני עובד אל מול התקן העולמי של W3C, ומתכנת בשפת PHP תוך שימוש בטכנולוגיות עדכניות, תוך שמירה על קוד שניתן לתחזוקה.
בין כישורי נמנים: PHP, SQL, (X)HTML, CSS (2-3), XML, JavaScript ( + jQuery) ועוד.

Zend Certified Engineer

  • דניאל: אחלה של מאמר. [...]
  • Shay | Exalted Web: אין סיבה שיהיו תווים מוזרים. פשוט שמור הכל בutf8, כולל את הdatabase, הhtml והphp, ואל תשכח להריץ שאי [...]
  • יונתן: אין לך בעיה עם תווים בעברית מהמסד? כל מה שאני שולף מוצג לי בתווים מוזרים.. [...]
  • Shay | Exalted Web: שמחתי לעזור :) [...]
  • יהונתן|YtsWeb: שי,תודה רבה על המאמר. חיפשתי באמת איך לחלק את העמודים בצורה טובה ושלא יראו 1000 מספרים. [...]

פרוייקט תכנות מונחה עצמים

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

קצת מידע

אחלק לפניכם את האתר לשלושה נושאים:

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