
הטקסט המלא של הדקות הראשונות בהרצאה «סוגים שונים של varchar» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, ברוכים הבאים להרצאה מעניינת על הבדלים בין ורצ'אר 8000 לוורצ'אר מקס. נראה מה זה גלישה של שורה, נראה מה זה לוב, וזאת הולכת להיות הרצאה מעניינת ומקצועית, וזה מה שמצפים מכם לדעת בתור אנשים שקובעים את סוגי העמודות.
נניח יש לנו טבלה חדשה, טבלת חשבוניות, ויש לנו נניח invoice ID, שזה איזשהו מספר אינטג'ר, ויש לנו כל מיני עמודות בחשבוניות שאין לי מושג מה זה העמודות האלו, אז נעשה אותם סתם אותיות שהן נניח 900 בייט כל אחת.
900 אותיות בעמודה מספר 1 ובעמודה מספר 2, וכך הלאה אנחנו נמשיך עם העמודות. שימו לב, char תופס בזיכרון בדיוק את אותו הגודל, זאת אומרת 900 אותיות תופסות 900 בייט כל עוד בייט אחד.
אם הייתי כותב פה nchar, כשזה אומר יוניקוד אז היוניקוד הזה תופס פי שתיים מקום אבל מאפשר לי לשמור שפות נוספות חוץ מאנגלית. אם יש לי חשבוניות בשפות נוספות חוץ מאנגלית עדיף להשתמש ביוניקוד ואז בו זמנית אפשר לשמור בעמודה הזאת גם אנגלית גם רוסית גם עברית וגם יפנית.
אם יש לי רק אנגלית אז אפשר להשתמש בצ'אר. שימו לב צ'אר תופס תמיד את כל הגודל של התא הזה. ברגע שזה 900, הוא תמיד יתפוס את כל ה-900 בתים, יכניס שם רווחים מיותרים, גם אם בפועל כתבתי בעמודה השנייה רק שלוש אותיות.
אם אני רוצה שיתפוס רק כמה שצריך עד 900 מקסימום, אבל לא תמיד את כל ה-900, רק כמה שצריך, יש סוג נתונים אחר שנקרא ורצ'ר. אם אתם תסתכלו פה, יש פה סוג נתונים שנקרא ורצ'ר, אז אני יכול לבחור אותו.
אז ורצ'אר תופס רק כמה שצריך מקום ולא יותר מזה. אז בינתיים אנחנו נסתפק בצ'אר כי יש לנו רק אנגלית ונעשה כמה עמודות. עוד איזה מגבלות יש לי? שימו לב, יש לי עוד מגבלה שצ'אר אות אחת לא יכול להיות 8,000 הוא כן יכול להיות אבל הוא לא יכול להיות 8,001.
8,001 כבר נותן לי שגיאה ואומר המקסימום המותר הוא 8,000 ולכן זה המקסימום שמותר 8,000. למה מותר מקסימום 8,000?
בגלל מבנה של עמוד. שימו לב, עמוד ב-SQL יכול לתפוס עד 8,000 קילו בייט, וזה עמודים.
SQL מאחורי הקלעים מנהל עמודים בדיסק, מחלק את הכל לוגית לעמודים של 8 קילו בייט, ואסור שעמודה תגלוש מעבר לשורה. עמודה תגלוש מעבר לעמוד. ולא רק שעמודה לא יכולה לעבור את העמוד, גם כל השורה ביחד לא יכולה לעבור את העמוד.
אז יש לנו שתי מגבלות. המגבלה הראשונה שעמודה לא יכולה לעבור את העמוד, ולא רק עמודה אחת לא יכולה לעבור, גם כל העמודות ביחד לא יכולות לעבור את הגודל של העמוד.
בואו נראה איך זה מתבטא. אז דבר ראשון שראינו שאי אפשר לעשות שער יותר מ-8,000 תווים, ואחרי זה אני אראה לכם איך פותרים את הבעיה הזאת, בינתיים תישארו איתי, תבינו שכל עמודה, אנחנו עכשיו בונים עמודות, כן?
כל עמודה יכולה להיות מקסימום 8,000 תווים, וכולם ביחד גם לא יכולים לעבור 8,000 תווים. זה שתי המגבלות שקיימות, אוקיי? בואו נראה את זה. קולום 9, 9,000, רגע, וקולום 10, 9,000.
הנה, עשיתי פה 10 עמודות שכל אחת 900 בייט, ואני עכשיו רוצה לשמור את כל זה. נותן שם לטבלה, קורא לה invoices, חשבוניות, ומקבל הודעת שגיאה שאסור שכל שורה, כל שורה, מה זה שורה?
זה כל העמודות ביחד. שורה זה כל העמודות ביחד. אסור ש... אם אומרים, תקשיב, כל השלך עובר את ה-9,000, ואסור שזה יעבור 8,060.
8,060 זה הגודל של הפייג', הגודל של העמוד. אז יש לנו שתי מגבלות, המגבלה הראשונה שכל עמודה לא יכולה לעבור את הגודל של העמוד וכל השורה לא יכולה לעבור את הגודל של העמוד כי מאחורי הקלעים sql נראה דבר כזה שיש עמוד ויש שורה ואסור שהשורה הזאת תעבור לעמוד הבא data row הוא 1, שורה עם נתונים מספר 1 לא יכולה פתאום לגלוש
לעמוד אחר. אם היא שורה קצרה אפשר להכניס כמה שורות בעמוד אבל אם משורה ארוכה יכולה להגיע מקסימום עד סוף העמוד, היא לא יכולה פתאום להמשיך בעמוד הבא.
וזה יצר בעיה חמורה וצעקו וכעסו על מייקרוסופט ומייקרוסופט באו ואמרו טוב אם אתם כל כך חשוב לכם שאפשר יהיה בשורה אחת להוריד את המגבלה הזאת מייקרוסופט באו ובשנת 2008 ב sql 2008 אפשרו מה שנקרא Overflow שהמידע יגלוש לעמוד השני אבל רק לארבע סוגי נתונים רק לVarchar ראינו אותו nVarchar שזה Varchar עם Unicode var
Binary שזה מידע בינארי משתנה בינארי זה תמונות כמו תמונות כמו JPEG לשמור ו-SQL Varian שזה סיפור נפרד אז רק ארבעת הסוגים האלו כן יכולים לגלוש לעמוד השני וברגע שהם גולשים לעמוד השני, זה נקרא רואו אוברפלואו, בעמוד הראשי שומרים רק 24 בייט של פוינטר, במקום לשמור 900 בייט או 7,000 בייט, אנחנו שומרים רק 24 בייט,
שהם אומרים איפה נמצא תכלס המידע. זה נקרא גלישה לעמוד הבא, וזה אפשרי רק עם ארבעה סוגים, שזה נקרא רואו אוברפלואו, אפשרי רק עם ארבעה הסוגים.
יפה מאוד, וזה מה שאני מראה לכם עכשיו, מה זה לוב, אנחנו נראה בהמשך. אז אם אני מחליף עכשיו את זה לוורצ'אר, לוורצ'אר, אני מקבל שזה 9,000, אבל אם אני שומר את זה, הוא כן נותן לי לשמור את זה. שימו לב, הוא כן נתן לי לשמור את זה.
ואם אני אעשה פה רפרש, הוא כן נותן לי, ואני רואה פה את כל העמודות של 10 עמודות של 900, שזה 9,000, וזה נהדר, פתרנו את הבעיה. בואו ננסה באמת להכניס את המידע לשמה ונראה מה קורה.
נעשה פה Select כוכבית From Invoices, עדיין אין לנו מידע, ונעשה Insert Into Invoices, להכניס לתוך החשבוניות Values, ערכים, איזה ערכים אנחנו רוצים להכניס פנימה?
אני רוצה לעשות ככה, אני רוצה לעשות Replicate לחשבונית מספר 1, ומה אני רוצה להכניס אליה? בתוך חשבונית מספר 1 אני רוצה להכניס אליה עמודה שנקראת רפליקייט לשכפל עוד נניח a שם עוד פעם אוקיי זו עמודה ראשונה זו שנייה זו שלישית רביעית חמישית שישית שביעית שמינית שעירית צדקתי טעיתי b d d d e f g h i j k 1 2 3 4 5 6 7 8 9 10
יפה מאוד, בואו ננסה לעשות את זה, ואת ה-select נעביר לסוף, ונריץ, יפה, קיבלנו, יופי, קיבלנו, יפה מאוד. בואו, אז הכל אבד לנו, אין לנו הודעות שגיאה קודם כל.
אתם רואים, הכל הצליח, הכנסנו שורה בגודל 900. עכשיו שימו לב, מה זה אומר? שקודם כל פתרנו את המגבלה, מגבלה, שבטבלה יכלו להיות רק 8,000 אותיות במקביל, ואת זה עשינו בזכות זה שמייקרוסופט מאפשרים לנו החל מ-2008 בארבעה סוגים בלבד לגלוש לעמוד השני.
יפה מאוד. עכשיו תגידו לי, יפה, אבל זה עדיין לא פותר את כל הבעיה, כי זה שפתרתי את הבעיה של רואו סייז לימיט, כאילו בעיית גודל שורה, עדיין לא פתרתי את הבעיה שכל רשומה חייבת להיות בתוך 8,000 בייטס.
אינדיבידואל קולומס. כל עמודה חייבת להיות 8,000 בייט. מצד אחד פתרתי את המגבלה של כל השורה אבל לא פתרתי את הבעיה של כל העמודה. מה זה אומר?
זה אומר שאם אני עכשיו רוצה לשים יותר נתונים בעמודה, זאת אומרת אני רוצה שהעמודה מספר 10 תהיה לא 900 בייט אלא נניח 8,000 בייט, הוא כן ייתן לי אבל 8,001 הוא כבר לא נותן.
למה הוא לא נותן 8,001? שמונת אלפים כי עדיין העמודה הבודדת חייבת להיות בתוך הגבולות של העמוד של הפייג' ואז מייקרוסופט אמרו טוב מה נעשה הם המציאו סוג נתונים חדש שנקרא לוב מה זה לוב לוב זה נקרא לארג' אובייקט והלוב הזה הוא נשמר במקום אחר לגמרי בזיכרון והוא נקרא ורצ'ר מקס שימו לב ורצ'ר מקס הוא שייך לקבוצה שנקראת Large Objects, בואו נראה את זה באתר
של מייקרוסופט איפה כל זה כתוב. במבנה של פייג' אתם יכולים לראות שיש דאטה רגיל, נתונים רגילים, שזה הכל חוץ מהנתונים האלו. למה? כי הנתונים האלו, שזה טקסט, אין טקסט וכל הסוגים האלו, נקראים Large Objects.
ולמה הם כל כך מיוחדים? כי הם שמורים בצורה אחרת, במקום אחר, אין להם מגבלות גודל, אבל יש להם חיסרון שאי אפשר לעשות אינדקס, לאנדקס את העמודות האלו.
ותכף נדבר על זה לעומק. שימו לב, טקסט זה טקסט עד שתי ג'יגה. אנטקסט זה טקסט ביוניקוד עד שתי ג'יגה מקום, זה אומר ג'יגה טקסט. ג'יגה זה כמה? זה מיליארד תווים.
עכשיו, מייקרוסופט רוצים שנפסיק להשתמש בטקסט ואנטקסט, והם אומרים שבגרסה הבאה, אחרי גרסה 2007, כבר לא יהיה בכלל עמודה כזאת מסוג טקסט ובמקום זה הם רוצים שנשתמש ב-NVarcharMax ו-VarcharMax ובמקום אימג' לשמירת תמונות שנשתמש בסוג שנקרא
VAR Binary. לנו זה לא כל כך משנה, אנחנו מכריזים על סוג עמודה מסוים וברגע שאנחנו מכריזים על סוג עמודה מהסוג הזה אנחנו לא מוגבלים לגודל של עמודה בודדת, אנחנו פותרים את הבעיה של עמודה בודדת.
אז בואו נעשה את זה. ניקח את העמודה מספר 10 ונעשה אותה, נניח אנחנו רוצים שיהיה פה 8,001 תווים והוא לא נותן לי, נכון?
אז מה אני עושה? אני עושה את זה varchar max, בוחר סוג נתון varchar max. ברגע שאני שמתי את זה כvarchar max, שימו לב, בזיכרון הוא לא תופס מקום, זה מינוס 1, כי הוא כבר הולך ל...
השורה הזאת, המאפיינים של השורה הזאת הולכת כבר לאזור שנקרא large objects - לוב, ה-900 הזה כן תופס מקום, וורצ'אר מקס הוא מיוחד, הוא שייך לקבוצת הלוב אז הוא במקום אחר לגמרי בזיכרון