RATSENO

[MySQL]리터럴 표기법 - 숫자 본문

DEV/SQL

[MySQL]리터럴 표기법 - 숫자

RATSENO 2018. 10. 11. 23:11



숫자

숫자 값을 상수로 SQL에 사용할 때는 다른 DBMS와 마찬가지로 따옴표(' 또는 ") 없이 숫자 값을 입력하면 된다.

또한 문자열 형태로 따옴표를 사용하더라도 비교 대상이 숫자 값이거나 숫자 타입의 칼럼이면 MySQL 서버가

문자열 값을 숫자 값으로 자동 변환해준다. 하지만 이처럼 숫자 값과 문자열 값을 비교할 때는 한 가지 주의해야

 할 사항이 있다. 서로 다른 타입으로 WHERE 조건 비교가 수행되는 다음 쿼리를 잠깐 살펴보자


SELECT * FROM tab_test 

WHERE number_column='10001'; 


SELECT * FROM tab_test

WHERE string_column=10001;


위 쿼리와 같이 두 비교 대상이 문자열과 숫자 타입으로 다를 때는 자동으로 타입의 변환이 발생한다.

MySQL은 숫자 타입과 문자열 타입 간의 비교에서 숫자 타입을 우선시하므로 문자열 값을 숫자 값으로 변환한 후 비교를 수행한다.


첫 번째 쿼리는 주어진 상수값을 숫자로 변환하는데, 이때는 상수값('10001') 하나만 변환하므로 성능과 관련된 문제가 발생하지 않는다.


두 번째 쿼리는 주어진 상수값(10001)이 숫자 값인데 비교되는 칼럼은 문자열 칼럼(string_column)이다. 이때 MySQL은 문자열 칼럼을 숫자로 변환해서 비교한다. 즉, string_column 칼럼의 모든 문자열 값을 숫자로 변환해서 수행해야 하므로 String_column칼럼의 모든 문자열 값을 숫자로 변환해서 비교를 수행해야 하므로 string_colmun에 인덱스가 있다 하더라도 이를 이용하지 못한다. 만약 string_column에 알파벳과 같은 문자가 포함된 경우에는 숫자 값으로 변환할 수 없으므로 쿼리 자체가 실패할 수도 있다. 


원천적으로 이러한 문제점을 제거하려면 숫자 값은 숫자 타입의 칼럼에만 저장해야한다.



참고서적 - Real MySQL   


'DEV > SQL' 카테고리의 다른 글

[MySQL]MySQL 연산자 - LIKE 연산자  (0) 2018.10.11
[MySQL]리터럴 표기법 - 날짜  (0) 2018.10.11
[ORACLE]INSERT ~ SELECT 형태  (0) 2018.01.22
[ORACLE]제약조건  (0) 2018.01.19
Comments