พฤติกรรม Type Coercion ใน MySQL
MySQL ทำ Implicit Type Conversion อัตโนมัติเมื่อเปรียบเทียบชนิดต่างกัน:
mysql> CREATE TABLE DemoTable1852 (
Value1 VARCHAR(20),
Value2 INT
);
mysql> INSERT INTO DemoTable1852 VALUES('1John',1), ('John',1), ('1',1), ('John1',1);
ผลลัพธ์การเปรียบเทียบ
mysql> SELECT Value1, Value2, Value1 = Value2 AS Result FROM DemoTable1852;
+--------+--------+--------+
| Value1 | Value2 | Result |
+--------+--------+--------+
| 1John | 1 | 1 |
| John | 1 | 0 |
| 1 | 1 | 1 |
| John1 | 1 | 0 |
+--------+--------+--------+
กฎการแปลง (String → Number)
- MySQL แปลง String เป็น Number โดยอ่านตัวเลขนำหน้า
'1John'→1(อ่านตัวเลขนำหน้าจนเจอตัวอักษร)'John'→0(ไม่มีตัวเลขนำหน้า)'1'→1'John1'→0(ตัวเลขอยู่ท้าย ไม่นำหน้า)
คำเตือน (Warnings)
4 rows in set, 3 warnings (0.00 sec)
MySQL แจ้ง Warning เมื่อเกิดการ truncate/convert ที่อาจสูญเสียข้อมูล
Best Practice
- หลีกเลี่ยงการเปรียบเทียบชนิดต่างกัน - ระบุชนิดให้ตรงกัน
- ใช้
CAST()หรือCONVERT()อย่างชัดเจน - เปิด
sql_mode=STRICT_ALL_TABLESเพื่อบังคับ Error แทน Warning - ตรวจสอบ
SHOW WARNINGSหลัง Query
ตัวอย่างการแปลงชัดเจน
-- แปลง INT เป็น VARCHAR
WHERE CAST(Value2 AS CHAR) = Value1
-- แปลง VARCHAR เป็น INT (ปลอดภัยกว่า)
WHERE Value1 = CAST(Value2 AS CHAR)
-- หรือ
WHERE CAST(Value1 AS UNSIGNED) = Value2