-
[MySQL] 숫자가 포함된 문자열 정렬데이터베이스/MySQL 2022. 7. 6. 21:27
📝 오늘 업무 하면서 알게 된 것 기록!
업무중에 다수의 지점을 이름 기준으로 정렬해야 했는데 지점명에 한글, 영문뿐만 아니라 숫자도 포함이 된 상황이었다. 처음에는 단순히 아래처럼 쿼리를 작성했다. (회사에서 실제로 사용했던 쿼리를 여기다가 그대로 적을 수는 없으니 ORDER BY 부분만 참고)SELECT tb_a.area_name FROM group.tb_area AS tb_a ORDER BY tb_a.area_name;
숫자와 문자알아서 구분되어 정렬될 거라고 생각했으나 사진과 같이 숫자 부분이 예상과 다르게 정렬되었다.
결론부터 이야기하자면 MySQL에서 텍스트 타입의 숫자는 문자로 인식된다.(당연한 얘기긴 하지만...) 그렇기 때문에 숫자는 숫자대로 문자는 문자대로 기준에 맞게 정렬하기 위해서는 아래처럼 작성해야 한다.SELECT tb_a.area_name FROM group.tb_area AS tb_a ORDER BY CAST(SUBSTR(tb_a.area_name FROM 1 FOR 3) AS UNSIGNED), tb_a.area_name;
area_name 앞에 숫자가 있었기 때문에 area_name의 첫 번째 자리부터 세 번째 자리까지의 문자를 잘라 숫자 타입(UNSIGNED)으로 형 변환해 1차적으로 오름차순 정렬을 하고(내 경우엔 문자열 안에 양수만 존재했기 때문에 UNSIGNED를 사용했지만 만약 음수까지 포함된 경우라면 SIGNED 사용하는 게 적절할 것 같다), area_name으로 2차 정렬을 했다. 사진에 나와있는 지점들에는 숫자가 포함되어 있으나 순수 한글로만 이루어진 지점들에 대해서도 정렬이 올바르게 적용되게 하기 위함이었다. (참고로 한글을 숫자로 형 변환하면 0이 나옴)
참고자료
'데이터베이스 > MySQL' 카테고리의 다른 글
[MySQL] 쿼리성능 개선하며 알게된 것 기록 📝 (0) 2022.08.20 [MySQL] Timestamp 타입과 Datetime 타입의 차이 🕰 (4) 2022.08.14 [MySQL] Table Lock (feat. Deadlock 💀) (0) 2022.04.18 [MySQL] 테이블의 auto increment number 가져오기 (0) 2022.03.28 [MySQL] GROUP_CONCAT length 제한 (0) 2022.03.04