개요

열 하나 더 생성하는 게 싫어서 한 레코드에 두 가지 데이터를 넣는 일이 종종 있다. ID가 R10인데 R은 분류고 10은 이 분류의 인덱스라던가. 아니 이런 경우는 없나, 내가 데이터베이스 설계를 잘 못 한 건가. lol

문제 파악

아무튼, 숫자형이 아닌 열에 숫자를 넣고 정렬하면 데이터 반환을 이상하게 한다. 예를 보면, var_char형 열에 [1, 2, 10, 11]을 넣고 내림차순 정렬하면 [2, 11, 10, 1] 이런 데이터를 반환한다.

mysql> select id from yoImTable order by id desc;
+----+
| id |
+----+
|  2 |
| 11 |
| 10 |
|  1 |
+----+
잠깐, [11, 10, 2, 1]가 아니잖아?!

해결

COLUMN * 1 로 간단히 해결할 수 있다. 그 외에 cast(), sotring_index(), convert()도 있지만 저게 가장 편하게 느껴진다.

mysql> select id from yoImTable order by id * 1 desc;
+----+
| id |
+----+
|  1 |
|  2 |
| 10 |
| 11 |
+----+

근데 이상하다. 내림차순 정렬일 텐데 오름차순 정렬된 데이터를 뿜었다. 내가 사용하는 MySQL 5.6.12에서는 안되는구나, 그러려니 하고 php의 array_reverse()로 수동으로 재정렬했지만, 분명 답은 있겠지.

별 정보 없는 글 길어 보이게 하는 것도 여간 힘든 일이 아니구나.


2014-02-28 추가. 드디어 내림차순 정렬하는 방법을 찾아 글을 수정한다!

mysql> select id from yoImTable order by length(id) desc, id desc;
+----+
| id |
+----+
| 11 |
| 10 |
|  2 |
|  1 |
+----+
저작자 표시 비영리
신고
  1. DB는 아직 배우지 않아서 잘 모르지만, id * 1 대신에 (int) i 등으로 캐스팅을 시도해볼 가치는 있다고 생각합니다.
    라고 적어놓고 보니, 이미 적어두셨네요. 자료형의 문제가 아닐까 합니다.
  2. 지나가다
    타입은 문자이지만 숫자만 입력된 데이터인 경우 ABS(filed)와 같이 함수로 묶어주면 숫자 타입으로 나옵니다.
    *1보다는 모양새가 좀 낫겠지요 ㅎㅎ..

Name __

Password __

Link (Your Website)

Comment