בנית-אתרים.com – בלוג בנית אתרים
בקטגוריה: טיפים והערות|כללי|מדריכי בנית אתרים
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, כך נחסוך מקום באופן משמעותי.
מקווה שלמדתם משהו חדש!
שמי שי ואני בונה אתרים וכיום חותך (מקודד) ומתכנת.
אני עובד אל מול התקן העולמי של W3C, ומתכנת בשפת PHP תוך שימוש בטכנולוגיות עדכניות, תוך שמירה על קוד שניתן לתחזוקה.
בין כישורי נמנים: PHP, SQL, (X)HTML, CSS (2-3), XML, JavaScript ( + jQuery) ועוד.
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 זה יכול לעשות אפילו בקפיצה אחת.
כמובן זה בתנאי שהטבלה מורכבת רק מעמודות שהן בגודל קבוע.