מי שמצליח להצדיק את התוצאה הזו מMySQL יזכה בחופשה בקאריבים:
CREATE TABLE t(a varchar(10));
INSERT INTO t(a) VALUES('aaa'),('bbb'),('ccc'),('ddd');
SELECT * FROM t WHERE a IN (666,'a');
+——+
| a |
+——+
| aaa |
| bbb |
| ccc |
| ddd |
+——+
INSERT INTO t(a) VALUES('aaa'),('bbb'),('ccc'),('ddd');
SELECT * FROM t WHERE a IN (666,'a');
+——+
| a |
+——+
| aaa |
| bbb |
| ccc |
| ddd |
+——+
רסיסים (RSS)
יוני 30th, 2008 ב1:34
מהתיעוד של mysql:
You should never mix quoted and unquoted values in an IN list because the comparison rules for quoted values (such as strings) and unquoted values (such as numbers) differ. Mixing types may therefore lead to inconsistent results.
מתוך: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in
אין הצדקה, אבל יודעים להגיד "אל תעשה את זה"…
יוני 30th, 2008 ב1:36
באג? לא חסרים באגים ב-MySQL. אבל תראה משהו מעניין, אם תנסה:
SELECT * FROM t WHERE a IN (BINARY 666, 'a');
תקבל תשובה נכונה.
לדעתי, ה-IN אמור לעשות השוואה בינארית, אבל במקרה הזה, שה-expression הוא סטרינג וברשימת החיפוש יש סוגי מידע שונים, הוא מפקשש עם המספר, ולא לוקח אותו כבינארי. לא מצאתי מספיק מידע על איך הוא משווה בין סוגי מידע שונים ברשימת החיפוש, אם הוא עושה קאסט ואיך.
תודיע לי אם תמצא פיתרון לדבר הזה.
יוני 30th, 2008 ב6:07
הכל בגלל ה-666 הזה.
מספר בעייתי
יוני 30th, 2008 ב7:19
יהונתן, מי קורא את התיעוד?
יוקס, 666 וbinary 666 הם ערכים שונים.
IN אמור לעשות השוואה שתלויה בסוג של המשתנים, אם המשתנים הם סטרינגים אז השוואה של סטרינגים, אם הם דאבלים אז דאבלים וכו'.
יש שם איזה באג מטופש, שאגב לא משתחזר ב5.1 (לפי הבאג ריפורט שפתחתי: http://bugs.mysql.com/bug.php?id=37730)
המעקף לבעיה במקרה שלי הוא פשוט:
SELECT * FROM t WHERE a IN ('666','a');
הסיבה ש666 לא קיבל גרשיים היא מטופשת במיוחד, הוא מספר ופונקציית הescape בPHP לא נוגעת במספרים.
המעקף שלי בעצם הוא בדיקה של ערכים מספריים, ועטיפה שלהם בגרשיים ישירות ולא עם escape.
גיא, זה מספר שימושי שכל האקר צריך להכיר.
הוא מוציא את הרוע מכל שרת.
יוני 30th, 2008 ב8:32
יכול להיות שהתוצאה שונה ממה שהיית מצפה לקבל.
בטוח שאין שום הגיון בשאילתה שבודקת האם שדה של מחרוזת מתאים למספק או מחרוזת.
יולי 1st, 2008 ב4:05
עמרי - הוא לא רק מוציא את הרוע אלא גם מוסיף רשומת Beast ל-DNS.
אכן, מספר חשוב