programing

Oracle의 varchar 정렬 순서가 varchar 비교 동작과 일치하지 않는 이유는 무엇입니까?

css3 2023. 10. 2. 15:22

Oracle의 varchar 정렬 순서가 varchar 비교 동작과 일치하지 않는 이유는 무엇입니까?

SQL 문은 다음과 같습니다.

select * from (
  select '000000000000' as x from dual
  union
  select '978123456789' as x from dual
  union 
  select 'B002AACD0A' as x from dual
) /*where x>'000000000000'*/ order by x;

수율:

B002AACD0A
000000000000
978123456789

WHERE-Restriction을 해제한 후 결과는 다음과 같습니다.

B002AACD0A
978123456789

저는 결과가 그저 그럴 것이라고 예상했을 것입니다.978123456789부터B002AACD0A이전에 반환됩니다.000000000000제한 없이 쿼리를 실행할 때.

이러한 행동은 어떻게 설명될 수 있습니까?그리고 어떻게 하면 varchars를 정렬하고 비교할 수 있을까요? 그러면 제가 정수를 사용할 수 있는 것처럼 함께 작업할 수 있게 되죠.

재미있게도, 제한을 다음으로 변경할 때.x>'B002AACD0A', 결과가 비어 있습니다.로 변경하기x>978123456789돌아온다B002AACD0A.

예를 들어 비교할 때:

B002AACD0A > 978123456789 > 000000000000

그러나 정렬할 때:

978123456789 > 000000000000 > B002AACD0A 

이진 정렬을 명시적으로 사용하는 경우 (order by NLSSORT(x,'NLS_SORT=BINARY_AI')), 결과는B002AACD0A>978123456789>000000000000그리고 비교의 행동을 일치시킵니다.하지만 저는 아직도 왜 이런 일이 일어나는지 모르겠어요.

피터야.

정렬 동작은 세션 매개 변수에 의해 조절되는 반면 비교 동작은 매개 변수에 따라 달라집니다.일치하지 않는 것이 틀림없습니다.

저는 다음 파라미터를 사용했을 때와 동일한 결과를 얻습니다.

SQL> SELECT *
  2    FROM nls_session_parameters
  3   WHERE parameter IN ('NLS_COMP', 'NLS_SORT');

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_SORT                       FRENCH
NLS_COMP                       BINARY

그러나 두 개가 일치하면 결과는 일치합니다.

SQL> alter session set nls_comp=LINGUISTIC;

Session altered

SQL> select * from (
  2    select '000000000000' as x from dual
  3    union
  4    select '978123456789' as x from dual
  5    union
  6    select 'B002AACD0A' as x from dual
  7  ) /*where x>'000000000000'*/ order by x;

X
------------
B002AACD0A
000000000000
978123456789

SQL> select * from (
  2    select '000000000000' as x from dual
  3    union
  4    select '978123456789' as x from dual
  5    union
  6    select 'B002AACD0A' as x from dual
  7  ) where x > '000000000000' order by x;

X
------------
978123456789

언급URL : https://stackoverflow.com/questions/7190714/why-does-oracles-varchar-sort-order-not-match-the-behavior-of-varchar-compariso