Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ทำไม MySQL การเปรียบเทียบชนิดข้อมูลต่างกันจึงไม่ Error

พฤติกรรม 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