PracticU

סוגים שונים של varchar

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › סוגים שונים של varchar
מילון מושגים:
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
SQL Server - מערכת ניהול מסדי נתונים יחסיים של מיקרוסופט, הנשלטת בשפת T-SQL.
שרת - מחשב או תוכנה שמספקים שירות למחשבים אחרים (לקוחות) ברשת, למשל אחסון קבצים, אתר אינטרנט או מסד נתונים, ומגיבים לבקשות שלהם.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
אינדקס - מבנה במסד נתונים שמאיץ חיפוש ושליפה. גם מספר המציין מיקום של איבר במערך.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.

סוגים שונים של varchar
ההרצאה משווה בין סוגי מחרוזות ב-SQL Server, ומסבירה את מגבלות הגודל של עמודות ודפים, גלישת שורות ו-varchar(max).
סוגי מחרוזות
1. char ו-nchar: char תופס תמיד את כל הגודל שהוגדר, גם אם הערך קצר ממנו. nchar שומר יוניקוד, ולכן תופס פי שתיים מקום, ומאפשר שמירה של שפות נוספות מלבד אנגלית.
2. varchar ו-nvarchar: תופסים רק את המקום שהערך צריך, עד לגודל המקסימלי שהוגדר. בשונה מ-char, אין מקום מבוזבז.
מגבלות גודל
3. 8,000 בתים לעמודה: עמודה אחת מסוג varchar לא יכולה לעלות על 8,000 תווים, ומעל זה השרת מחזיר שגיאה.
4. 8,060 בתים לשורה: דף נתונים ב-SQL Server הוא 8 קילובייט, וכל השורה חייבת להישאר בתוך דף אחד. ההרצאה מדגימה שורה של 10 עמודות בגודל 900 תווים כל אחת, שנדחתה כי היא חרגה מהגבול.
5. גלישת שורה (Row Overflow): מאז SQL Server 2008, סוגים כמו varchar, nvarchar, varbinary ו-sql_variant יכולים לגלוש לדף אחר. בדף הראשי נשמר מצביע של 24 בתים במקום הערך עצמו.
6. varchar(max) ו-nvarchar(max): עמודה כזו יכולה להגיע עד 2 ג'יגה, והיא שייכת לקבוצת Large Objects (LOB). המידע נשמר במקום נפרד, ולכן אין מגבלה של עמודה בודדת. החיסרון: אי אפשר לבנות עליה אינדקס.
7. אינדקס: מפתח אינדקס מוגבל ל-900 בתים. לכן עמודה שצריך לחפש בה במהירות תהיה קטנה מ-900 בתים, ולא LOB.
בדיקת הדפים
8. sys.dm_db_index_physical_stats: מציג כמה דפים יש לטבלה מכל סוג: רגיל, גולש ו-LOB. בדוגמה נמצאו ארבעה דפים רגילים, שני דפים גולשים ו-1,200 דפי LOB.
9. מבנה הדף: כותרת של 96 בתים, ואחריה השורות. ההרצאה מציגה את התוכן של דף בודד, כולל המצביעים לדפי הגלישה.
שימו לב
דף LOB הוא גם 8 קילובייט. בדיקת דף כזה מראה תוכן חוזר של התווים שהוכנסו, כי ההדגמה מכניסה ערך ארוך מאוד.
בוחרים את סוג העמודה לפי הגודל הצפוי, ולפי הצורך באינדקס.

פרקי ההרצאה: סוגים שונים של varchar

  1. 00:00

    מבוא: VARCHAR, CHAR ו-NVARCHAR

  2. 00:58

    NCHAR ויוניקוד לשפות נוספות

  3. 02:29

    מגבלת 8,000 בייט בעמוד

  4. 05:28

    גלישת נתונים לעמוד הבא

  5. 08:46

    הכנסת שורה ארוכה לטבלה

  6. 10:52

    מגבלת כל עמודה ל-8,000 בייט

  7. 11:41

    סוג LOB: VARCHAR(MAX)

  8. 13:20

    VARCHAR(MAX) במקום TEXT

תמלול ההרצאה: סוגים שונים של varchar

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

  1. 00:02

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

  2. 00:23

    נניח יש לנו טבלה חדשה, טבלת חשבוניות, ויש לנו נניח invoice ID, שזה איזשהו מספר אינטג'ר, ויש לנו כל מיני עמודות בחשבוניות שאין לי מושג מה זה העמודות האלו, אז נעשה אותם סתם אותיות שהן נניח 900 בייט כל אחת.

  3. 00:45

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

  4. 01:03

    אם הייתי כותב פה nchar, כשזה אומר יוניקוד אז היוניקוד הזה תופס פי שתיים מקום אבל מאפשר לי לשמור שפות נוספות חוץ מאנגלית. אם יש לי חשבוניות בשפות נוספות חוץ מאנגלית עדיף להשתמש ביוניקוד ואז בו זמנית אפשר לשמור בעמודה הזאת גם אנגלית גם רוסית גם עברית וגם יפנית.

  5. 01:28

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

  6. 01:49

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

  7. 02:06

    אז ורצ'אר תופס רק כמה שצריך מקום ולא יותר מזה. אז בינתיים אנחנו נסתפק בצ'אר כי יש לנו רק אנגלית ונעשה כמה עמודות. עוד איזה מגבלות יש לי? שימו לב, יש לי עוד מגבלה שצ'אר אות אחת לא יכול להיות 8,000 הוא כן יכול להיות אבל הוא לא יכול להיות 8,001.

  8. 02:29

    8,001 כבר נותן לי שגיאה ואומר המקסימום המותר הוא 8,000 ולכן זה המקסימום שמותר 8,000. למה מותר מקסימום 8,000?

  9. 02:42

    בגלל מבנה של עמוד. שימו לב, עמוד ב-SQL יכול לתפוס עד 8,000 קילו בייט, וזה עמודים.

  10. 02:56

    SQL מאחורי הקלעים מנהל עמודים בדיסק, מחלק את הכל לוגית לעמודים של 8 קילו בייט, ואסור שעמודה תגלוש מעבר לשורה. עמודה תגלוש מעבר לעמוד. ולא רק שעמודה לא יכולה לעבור את העמוד, גם כל השורה ביחד לא יכולה לעבור את העמוד.

  11. 03:19

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

  12. 03:33

    בואו נראה איך זה מתבטא. אז דבר ראשון שראינו שאי אפשר לעשות שער יותר מ-8,000 תווים, ואחרי זה אני אראה לכם איך פותרים את הבעיה הזאת, בינתיים תישארו איתי, תבינו שכל עמודה, אנחנו עכשיו בונים עמודות, כן?

  13. 03:51

    כל עמודה יכולה להיות מקסימום 8,000 תווים, וכולם ביחד גם לא יכולים לעבור 8,000 תווים. זה שתי המגבלות שקיימות, אוקיי? בואו נראה את זה. קולום 9, 9,000, רגע, וקולום 10, 9,000.

  14. 04:25

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

  15. 04:49

    זה כל העמודות ביחד. שורה זה כל העמודות ביחד. אסור ש... אם אומרים, תקשיב, כל השלך עובר את ה-9,000, ואסור שזה יעבור 8,060.

  16. 05:03

    8,060 זה הגודל של הפייג', הגודל של העמוד. אז יש לנו שתי מגבלות, המגבלה הראשונה שכל עמודה לא יכולה לעבור את הגודל של העמוד וכל השורה לא יכולה לעבור את הגודל של העמוד כי מאחורי הקלעים sql נראה דבר כזה שיש עמוד ויש שורה ואסור שהשורה הזאת תעבור לעמוד הבא data row הוא 1, שורה עם נתונים מספר 1 לא יכולה פתאום לגלוש

  17. 05:37

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

  18. 05:49

    וזה יצר בעיה חמורה וצעקו וכעסו על מייקרוסופט ומייקרוסופט באו ואמרו טוב אם אתם כל כך חשוב לכם שאפשר יהיה בשורה אחת להוריד את המגבלה הזאת מייקרוסופט באו ובשנת 2008 ב sql 2008 אפשרו מה שנקרא Overflow שהמידע יגלוש לעמוד השני אבל רק לארבע סוגי נתונים רק לVarchar ראינו אותו nVarchar שזה Varchar עם Unicode var

  19. 06:29

    Binary שזה מידע בינארי משתנה בינארי זה תמונות כמו תמונות כמו JPEG לשמור ו-SQL Varian שזה סיפור נפרד אז רק ארבעת הסוגים האלו כן יכולים לגלוש לעמוד השני וברגע שהם גולשים לעמוד השני, זה נקרא רואו אוברפלואו, בעמוד הראשי שומרים רק 24 בייט של פוינטר, במקום לשמור 900 בייט או 7,000 בייט, אנחנו שומרים רק 24 בייט,

  20. 07:02

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

  21. 07:21

    יפה מאוד, וזה מה שאני מראה לכם עכשיו, מה זה לוב, אנחנו נראה בהמשך. אז אם אני מחליף עכשיו את זה לוורצ'אר, לוורצ'אר, אני מקבל שזה 9,000, אבל אם אני שומר את זה, הוא כן נותן לי לשמור את זה. שימו לב, הוא כן נתן לי לשמור את זה.

  22. 07:56

    ואם אני אעשה פה רפרש, הוא כן נותן לי, ואני רואה פה את כל העמודות של 10 עמודות של 900, שזה 9,000, וזה נהדר, פתרנו את הבעיה. בואו ננסה באמת להכניס את המידע לשמה ונראה מה קורה.

  23. 08:16

    נעשה פה Select כוכבית From Invoices, עדיין אין לנו מידע, ונעשה Insert Into Invoices, להכניס לתוך החשבוניות Values, ערכים, איזה ערכים אנחנו רוצים להכניס פנימה?

  24. 08:45

    אני רוצה לעשות ככה, אני רוצה לעשות 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

  25. 09:45

    יפה מאוד, בואו ננסה לעשות את זה, ואת ה-select נעביר לסוף, ונריץ, יפה, קיבלנו, יופי, קיבלנו, יפה מאוד. בואו, אז הכל אבד לנו, אין לנו הודעות שגיאה קודם כל.

  26. 10:14

    אתם רואים, הכל הצליח, הכנסנו שורה בגודל 900. עכשיו שימו לב, מה זה אומר? שקודם כל פתרנו את המגבלה, מגבלה, שבטבלה יכלו להיות רק 8,000 אותיות במקביל, ואת זה עשינו בזכות זה שמייקרוסופט מאפשרים לנו החל מ-2008 בארבעה סוגים בלבד לגלוש לעמוד השני.

  27. 10:41

    יפה מאוד. עכשיו תגידו לי, יפה, אבל זה עדיין לא פותר את כל הבעיה, כי זה שפתרתי את הבעיה של רואו סייז לימיט, כאילו בעיית גודל שורה, עדיין לא פתרתי את הבעיה שכל רשומה חייבת להיות בתוך 8,000 בייטס.

  28. 11:04

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

  29. 11:15

    זה אומר שאם אני עכשיו רוצה לשים יותר נתונים בעמודה, זאת אומרת אני רוצה שהעמודה מספר 10 תהיה לא 900 בייט אלא נניח 8,000 בייט, הוא כן ייתן לי אבל 8,001 הוא כבר לא נותן.

  30. 11:44

    למה הוא לא נותן 8,001? שמונת אלפים כי עדיין העמודה הבודדת חייבת להיות בתוך הגבולות של העמוד של הפייג' ואז מייקרוסופט אמרו טוב מה נעשה הם המציאו סוג נתונים חדש שנקרא לוב מה זה לוב לוב זה נקרא לארג' אובייקט והלוב הזה הוא נשמר במקום אחר לגמרי בזיכרון והוא נקרא ורצ'ר מקס שימו לב ורצ'ר מקס הוא שייך לקבוצה שנקראת Large Objects, בואו נראה את זה באתר

  31. 12:28

    של מייקרוסופט איפה כל זה כתוב. במבנה של פייג' אתם יכולים לראות שיש דאטה רגיל, נתונים רגילים, שזה הכל חוץ מהנתונים האלו. למה? כי הנתונים האלו, שזה טקסט, אין טקסט וכל הסוגים האלו, נקראים Large Objects.

  32. 12:48

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

  33. 13:04

    ותכף נדבר על זה לעומק. שימו לב, טקסט זה טקסט עד שתי ג'יגה. אנטקסט זה טקסט ביוניקוד עד שתי ג'יגה מקום, זה אומר ג'יגה טקסט. ג'יגה זה כמה? זה מיליארד תווים.

  34. 13:18

    עכשיו, מייקרוסופט רוצים שנפסיק להשתמש בטקסט ואנטקסט, והם אומרים שבגרסה הבאה, אחרי גרסה 2007, כבר לא יהיה בכלל עמודה כזאת מסוג טקסט ובמקום זה הם רוצים שנשתמש ב-NVarcharMax ו-VarcharMax ובמקום אימג' לשמירת תמונות שנשתמש בסוג שנקרא

  35. 13:38

    VAR Binary. לנו זה לא כל כך משנה, אנחנו מכריזים על סוג עמודה מסוים וברגע שאנחנו מכריזים על סוג עמודה מהסוג הזה אנחנו לא מוגבלים לגודל של עמודה בודדת, אנחנו פותרים את הבעיה של עמודה בודדת.

  36. 13:59

    אז בואו נעשה את זה. ניקח את העמודה מספר 10 ונעשה אותה, נניח אנחנו רוצים שיהיה פה 8,001 תווים והוא לא נותן לי, נכון?

  37. 14:14

    אז מה אני עושה? אני עושה את זה varchar max, בוחר סוג נתון varchar max. ברגע שאני שמתי את זה כvarchar max, שימו לב, בזיכרון הוא לא תופס מקום, זה מינוס 1, כי הוא כבר הולך ל...

  38. 14:30

    השורה הזאת, המאפיינים של השורה הזאת הולכת כבר לאזור שנקרא large objects - לוב, ה-900 הזה כן תופס מקום, וורצ'אר מקס הוא מיוחד, הוא שייך לקבוצת הלוב אז הוא במקום אחר לגמרי בזיכרון

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: פקודת Update למתקדמים

ההרצאה הבאה: יצירת טבלה - ממשק גרפי

הרצאות קשורות מקורסים אחרים

  • סוגים של NoSQL
  • הרצת הטסטים - עם דפדפנים שונים
  • פרויקט Git בכמה מקומות שונים - Clone

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI