MS-SQL과 Oracle DB의 정렬 차이, 같은 데이터가 다르게 보이는 이유

database
Image by geralt from Pixabay

MS-SQL과 Oracle에서 같은 ORDER BY를 사용했는데 결과 순서가 다르다면, 대부분 데이터 자체가 아니라 정렬 규칙이 다른 것입니다. 특히 대소문자, 악센트, NULL, 한글 정렬 기준을 먼저 확인해야 합니다.

같은 기준으로 보면 무엇이 다른가

비교 기준MS-SQLOracle
정렬 규칙의 출발점열 또는 데이터베이스의 Collation 설정 영향을 받음문자열 비교 방식과 NLS_SORT 등 세션·환경 설정 영향을 받음
대소문자Case-insensitive Collation이면 대소문자를 같게 취급할 수 있음기본 설정과 NLS_SORT에 따라 대소문자 순서가 달라질 수 있음
악센트·문자 구분Accent-sensitive 여부에 따라 구분언어별 정렬 설정에 따라 구분 방식이 달라질 수 있음
NULL 정렬ASC에서 NULL이 일반적으로 먼저 정렬됨ASC에서 NULL이 일반적으로 뒤에 정렬됨
동일한 값의 순서ORDER BY 기준이 같으면 추가 순서를 보장하지 않음Oracle도 동일하게 추가 순서를 보장하지 않음

표의 내용은 기본적인 차이를 보여 주는 기준입니다. 실제 결과는 MS-SQL의 Collation, Oracle의 NLS_SORT와 세션 설정, 사용하는 데이터 타입에 따라 달라질 수 있습니다. 따라서 운영 환경에서 결과가 중요하다면 DB 종류만 보고 판단하지 말고 해당 설정을 함께 확인해야 합니다.

대소문자와 한글은 왜 결과가 달라질까?

예를 들어 다음과 같은 값이 있다고 하겠습니다.

Apple
apple
Banana
banana

MS-SQL에서 대소문자를 구분하지 않는 Collation을 사용하면 Apple과 apple을 같은 값처럼 비교할 수 있습니다. Oracle에서는 세션의 정렬 설정이나 함수 적용 여부에 따라 대소문자 순서가 달라질 수 있습니다. 한글 역시 단순한 유니코드 값 순서가 아니라 언어별 정렬 규칙을 적용하면 기대한 순서와 실제 순서가 달라질 수 있습니다.

문자열 정렬 결과를 화면에 그대로 의존하지 마세요. 페이징, 순번 부여, CSV 생성처럼 순서가 재현되어야 하는 기능은 정렬 기준을 명시적으로 설계해야 합니다.

NULL 정렬은 이식할 때 가장 먼저 확인할 부분

예를 들어 점수 열에 100, 80, NULL이 있을 때 ASC 정렬을 실행하면 DBMS에 따라 NULL의 위치가 달라질 수 있습니다. 일반적으로 MS-SQL은 ASC에서 NULL을 먼저, Oracle은 ASC에서 NULL을 뒤에 배치합니다. 이 차이는 목록 첫 화면에 빈 값이 나타나는지, 마지막 페이지로 밀리는지에 직접 영향을 줍니다.

두 DB에서 같은 위치를 원한다면 NULL 여부를 정렬식에 포함하는 방식이 안전합니다. 예를 들어 NULL을 항상 마지막에 두려면 다음처럼 정렬 우선순위를 별도로 지정할 수 있습니다.

ORDER BY
  CASE WHEN score IS NULL THEN 1 ELSE 0 END,
  score ASC

이 방식은 특정 DB의 기본 NULL 정렬에 기대지 않고, 먼저 NULL 여부를 비교한 뒤 실제 점수를 비교합니다. 다만 Oracle에서 빈 문자열이 NULL처럼 취급되는 특성이 있으므로, 빈 문자열 데이터를 사용하는 경우에는 별도 확인이 필요합니다.

같은 값이 많다면 두 DB 모두 추가 기준이 필요하다

이름만 ORDER BY 하면 같은 이름을 가진 행의 내부 순서는 고정되지 않을 수 있습니다. MS-SQL과 Oracle 어느 쪽이든 데이터 입력 순서나 실행 계획에 따라 결과가 달라질 수 있습니다.

ORDER BY customer_name ASC, customer_id ASC

이처럼 이름 뒤에 고유한 customer_id를 추가하면 결과를 재현하기 쉬워집니다. 페이징이나 API 응답처럼 사용자가 순서 변화를 바로 느끼는 기능이라면 저는 이 보조 정렬 기준을 필수에 가깝게 봅니다.

어떤 상황에서 어떻게 선택할까

  • 단순한 숫자 정렬이라면 두 DB 모두 큰 차이보다 NULL 처리와 동일 값의 추가 기준을 먼저 확인합니다.
  • 이름·주소·상품명처럼 문자열 정렬이 핵심이면 MS-SQL의 Collation과 Oracle의 NLS_SORT 설정을 운영·개발 환경에서 각각 확인합니다.
  • DB를 교체하거나 SQL을 이식한다면 ORDER BY 결과를 샘플 데이터로 비교하고, 대소문자·한글·악센트·NULL을 모두 포함해 검증합니다.
  • 정렬 결과가 업무 규칙이라면 기본 설정에 맡기지 말고 CASE, 명시적 정렬식, 고유 키를 사용해 기준을 코드에 드러냅니다.

정렬이 단순히 보기 좋은 순서를 정하는 문제라면 환경별 차이가 작을 수 있습니다. 하지만 순위, 페이징, 최신순 목록처럼 결과가 업무 로직이 되는 경우에는 DB 기본값보다 정렬 규칙을 직접 명시하는 쪽을 권합니다. 최종 판단 기준은 DB 제품명이 아니라 Collation·NLS 설정과 NULL 처리 요구사항입니다.