MySQL에서 필드의 타입과 맞지 않는 데이터로 질의를 날리면,
자동으로 타입캐스팅
이 된다는 것은 모두 알고 있는 사실일 것이다.
근데, VARCHAR 타입인 someField에 대해
질의를 WHERE some_field = 0
으로 날리면 어떻게 될까?
(나도 알고싶지 않았다)
들어가기 앞서, MySQL의 스펙부터 공유하면
MySQL 8.0.34 버전에, 테이블 엔진은 InnoDB 이다.
우선, 테이블 정의부터 해보자.
create table test_table
(
some_field varchar(200) null comment '썸띵 필드'
) comment '테스트 테이블' engine = InnoDB;
그다음, 테스트 데이터를 넣어보자.
insert into test_table (some_field)
values ('ABC'),
('15Kg'),
('Blog'),
('10by10'),
('1plus1is2'),
('2e3');
그리고, 아래의 질의를 날려보자.
SELECT *
FROM test_table
where some_field = 0;
결과는 아래와 같이 나온다.
some_field |
---|
ABC |
Blog |
이유는 스택오버플로우(mysql-select-on-varchar-column-with-0-zero-as-criteria-returns-all-rows)에서 확인할 수 있는데, 간략히 정리하자면 아래와 같다.
대충
varchar 타입인데
{숫자}{문자열} -> {숫자}
{문자열} -> 0
이렇게 나오는데 예외적으로
2e3 같은 숫자 약속? 같은건 2 X 10^3 = 2000으로 캐스팅 된다고 한다.
우리의 예시 데이터로 확인해보면
실제 데이터 | (숫자로 검색할 때 )캐스팅 되는 데이터 |
---|---|
ABC | 0 |
15kg | 15 |
Blog | 0 |
10by10 | 10 |
1plus1is2 | 1 |
2e3 | 2000 |
즉, 문자열 중간에 위치한 숫자와 상관 없이,
숫자로 시작하는 문자열 부분이 숫자로 인식된다.