[mySQL] 데이터 타입 바꿔서 검색 cast()

728x90

데이터 정렬은 order by ~를 통해 asc(오름차순), desc(내림차순)으로 정렬한다.

 

데이터를 정렬할 때 

  • 숫자형(INT 등)인 경우와,
  • 문자열형(TEXT 등)인지에 따라

정렬 결과가 달라진다.

아래 그림을 보면 ordering_test라는 테이블에서 data 컬럼을 기준으로 오름차순 정렬을 하고있다.

크기가 큰 순서대로 정렬되어 있다(오름차순)

data의 데이터 타입을 INT-> TEXT로 바꾼 뒤,

Apply 버튼을 눌러서 적용,

다시 정렬을 실행시켜보면,

이전과 다른 결과가 나온다.

그건 INT 타입과 TEXT 타입의 정렬 방식이 다르기 때문이다.

 

INT 타입의 값은 숫자의 대소(크고 작음)를 기준으로 정렬이 수행되지만,

TEXT 타입의 값은 숫자의 대소가 아니라 한 문자, 한 문자씩 그 문자 순서를 비교해서 정렬이 수행된다.

 

예를 들어 지금 120이 19보다 먼저 나오게 된 것은, 일단 맨 앞의 1을 비교했더니 같았지만,

그 바로 뒷 자리는 문자 2가 문자 9보다 문자 순서상 더 앞에 있는 것이기 때문에 120이 더 먼저 나오기 때문이다.

 

그리고 230과 27을 보면 앞 자리의 2는 같지만 그 다음은 3과 7로, 7이 문자 순서상 더 뒤이기 때문에

27이 더 뒤에 나온 것이다.

 

숫자값이 담긴 컬럼을 정렬 기준으로 할 때는 그 컬럼의 데이터 타입이 숫자형인지, 문자열형인지

데이터 타입이 중요하다!

 

그런데 이미 TEXT 타입인 컬럼에 있는 숫자값들을,

그냥 INT 등의 숫자형 타입으로 보고 정렬하기 위해서는

정렬할 때 그 컬럼의 값들의 데이터 타입을 일시적으로 변경하면 된다.

 

 CAST()

CAST는 ‘틀을 만들다', '틀을 정하다'라는 뜻을 가진 영어 단어로.

보통 프로그래밍 세계에서 어떤 변수의 데이터 타입을 바꿀 때 사용되는 단어이다.

 

 CAST(data AS signed)는 data 컬럼의 데이터 타입을 일시적으로 signed 데이터 타입으로 변환하라는 뜻이다.

(signed = 양수와 음수를 포함한 모든 정수를 나타낼 수 있는 데이터 타입)

 

이 쿼리를 실행하면,  data 컬럼의 타입이 INT였을 때와 같은 결과가 나온다. 일시적으로 signed로 변환되었기 때문이다.

 

만약 어떤 컬럼의 숫자값들이 TEXT 같은 문자열 타입으로 저장돼있지만,

정렬 기준으로 쓸 때는 숫자형으로 사용하고 싶다면 CAST() 함수를 쓰면 된다.

 

참고로 만약 문자열 타입으로 저장된 숫자값에 소수점이 포함되어 있다면

signed 대신 decimal(소수점이 있는 수를 나타내는 타입)을 적어주고 사용하면 된다.

728x90