במאמר הקודם למדנו על אופטימיזציה של MySQL: יצירת טבלאות זמניות ואופטימיזציה של שאילתות UPDATE ו-INSERT. במאמר הזה אנו נלמד על הודעות השגיאה והאזהרות של MySQL וכיצד לבדוק אותן ולפענח אותן.
באופן עקרוני, ב-MySQL יש לנו Warnings שמצביעות על בעיות לא מהותיות ו-ERRORS המצביעות על בעיות מהותיות של ממש שמונעות את השלמת הפקודה.
מבנה הודעת אזהרה (warnings)
המבנה של האזהרות הוא פשוט ביותר, לאחר השלמת השאילתה אני מקבל דיווח על מספר השורות שהתעדכן ועל מספר האזהרות (אם יש כאלו). למשל, אם אני אריץ את השאילתה הזו על טבלת integers שה-Data Type שלה הוא INT UNSIGNED NOT NULL:
INSERT INTO integers VALUES ('abc'), (-5), (NULL);
אני אקבל את התוצאה הזו:
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 3
השאילתה עצמה תקינה, אך יש שלוש אזהרות. על מנת לראות את האזהרות האלו, אני צריך להריץ את הפקודה SHOW WARNINGS. אם אני אריץ אותה אני אראה את התקלות הבאות:
*************************** 1. row ***************************
Level: Warning
Code: 1264
Message: Out of range value adjusted for column 'i' at row 1
*************************** 2. row ***************************
Level: Warning
Code: 1264
Message: Out of range value adjusted for column 'i' at row 2
*************************** 3. row ***************************
Level: Warning
Code: 1263
Message: Column set to default value; NULL supplied to NOT NULL
column 'i' at row 3
3 rows in set (0.00 sec)
התקלות האלו מראות לי בדיוק מה היתה הבעיה ומה היה הפתרון של MySQL. הפתרון הוא לתת לערכים את הערך הדיפולטיבי במקום את הערך שניסינו להכניס – אי אפשר להכניס -5 לשדה שהוגדר כ-UNSIGNED, אי אפשר להכניס NULL לשדה שהוגדר כ-NOT NULL ואי אפשר להכניס טקסט לשדה שהוגדר כ-INT.
מבנה הודעת ה-SHOW WARNINGS מחולק לכמה חלקים, החלק הראשון הוא תיאור טקסטואלי של האזהרה. החלק השני הוא מספר הקוד של MySQL לבעיה ואילו החלק הנוסף הוא רמת החומרה של הבעיה כאשר warning זו כאמור אזהרה, note זה לידיעה בלבד ו-error זו בעיה שמונעת את השלמת השאילתה.
SHOW WARNINGS מראה לנו גם את הבעיות. אם נריץ את השאילתה הזו:
SELECT * FROM no_such_table;
נקבל את השגיאה הבאה:
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
SHOW WARNINGS יראה לנו את הטבלה הבאה:
+-------+------+------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------+
| Error | 1146 | Table 'test.no_such_table' doesn't exist |
+-------+------+------------------------------------------+
מבנה הודעת השגיאה
אם נסתכל על הודעת השגיאה הזו:
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
נראה שהיא מורכבת מכמה חלקים – החלק הראשון הוא ERROR + מספר השגיאה ב-MySQL, החלק השני (בסוגריים) הוא מספר הקוד של ה-ODBC. והחלק השלישי הוא תיאור טקסטואלי של הבעיה.
אנו יכולים להשתמש ב-SHOW ERRORS על מנת לראות את כל השגיאות החמורות שיש לנו או להשתמש ב-SHOW WARNINGS ולראות גם את האזהרות.
תקלות low-level
חלק זה אינו רלוונטי למפתחים שמפתחים על wamp.
תקלות אלו מתקיימות כאשר יש בעיה במערכת שעליה ה-MySQL יושב. אולי הדיסק של המחשב מלא, או שיש בעיה עם הרשאות הקבצים (בלינוקס) או כל בעיה שקשורה ל-System. בעית low-level כזו מאופיינת בציון של Errcode בהודעת השגיאה. למשל:
ERROR 1 (HY000): Can't create/write to file './whatever.frm'
(Errcode: 13)
אפשר לראות שיש לנו Errcode ואפשר לראות שיש לנו מספר. אך אנו לא יודעים מדוע אי אפשר לכתוב לקובץ whatever.frm. בשביל זה יש לנו את תוכנת perror שבאה יחד עם ההפצה של MySQL. נכנס לקונסול החביב עלינו ונכתוב:
shell> perror 13
ונקבל את הפלט הבא:
Error code 13: Permission denied
כלומר הבעיה היא בגלל בעיית הרשאות. סביר להניח שמישהו שינה את הרשאות הקובץ ויש לתת ל-MySQL את היכולת לקרוא ולכתוב מהקובץ whatever.frm.
⚠️המדריכים כאן הם טעימה בלבד! יש ספר מקיף המלמד MySQL מרמת בסיס ועד רמה מתקדמת. הספר הדיגיטלי, שרלוונטי גם לכל מסדי הנתונים שעובדים עם SQL – זמין כאן כחלק מהפרויקט "ללמוד ג'אווהסקריפט בעברית" – זו הדרך הטובה ביותר ללמוד באופן מקיף MySQL.
במאמר הבא אנו נדון בהתקנה ובעבודה על MySQL בסביבה הביתית שלו – מערכת לינוקס.