문자열 컬럼(VARCHAR 등)을 숫자 0과 비교하면 MySQL은 문자열을 숫자로 변환해 비교합니다. 숫자로 시작하지 않는 문자열은 0으로 변환되어 모든 행이 매칭됩니다(경고 발생).
테이블 생성 및 데이터 삽입
mysql> CREATE TABLE DemoTable1791 (
-> FirstName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO DemoTable1791 VALUES('David');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1791 VALUES('John');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1791 VALUES('Carol');
Query OK, 1 row affected (0.00 sec)
데이터 조회
mysql> SELECT * FROM DemoTable1791;
+-----------+ | FirstName | +-----------+ | David | | John | | Carol | +-----------+ 3 rows in set (0.00 sec)
문자열 컬럼 = 0 조건 실행
mysql> SELECT * FROM DemoTable1791 WHERE FirstName = 0;
+-----------+ | FirstName | +-----------+ | David | | John | | Carol | +-----------+ 3 rows in set, 3 warnings (0.00 sec)
원인: MySQL은 문자열을 숫자 컨텍스트에서 평가할 때 앞부분 숫자를 파싱합니다. 'David' → 0, 'John' → 0, 'Carol' → 0. 모두 0이 되어 조건 만족. SHOW WARNINGS로 "Truncated incorrect INTEGER value" 경고 확인 가능.
교훈: 타입이 다른 비교는 피하고, 명시적 캐스트(CAST(컬럼 AS UNSIGNED)) 또는 올바른 타입 리터럴('0')을 사용하세요.