MySQL 에서 VARCHAR 데이터를 숫자로 검색하면 벌어지는 일

조갱·2024년 2월 24일
0

이슈 해결

목록 보기
14/14

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으로 캐스팅 된다고 한다.

우리의 예시 데이터로 확인해보면

실제 데이터(숫자로 검색할 때 )캐스팅 되는 데이터
ABC0
15kg15
Blog0
10by1010
1plus1is21
2e32000

즉, 문자열 중간에 위치한 숫자와 상관 없이,
숫자로 시작하는 문자열 부분이 숫자로 인식된다.

profile
A fast learner.

0개의 댓글