Oracle'ın varchar sıralama düzeni neden varchar karşılaştırmasıyla uyuşmuyor?
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;
gibi bir SQL deyimi NEREDE-kısıtlama uncommenting sonra
B002AACD0A
000000000000
978123456789
verir, sonuç
B002AACD0A
978123456789
olduğunu ben sadece 978123456789
B002AACD0A
beri olması sonucunu beklerdik kısıtlama olmadan sorguyu çalıştırırken 000000000000
'dan önce döndürülür.
Bu davranış nasıl açıklanabilir? Ve nasıl varcharları sıralamak ve karşılaştırmalıyım, böylece tamsayılarla yapabileceğim gibi birlikte çalışabilirler mi?
EDIT: Eğlence, x>'B002AACD0A'
kısıtlama değiştirirken, sonuç yeterince boş. x>978123456789
olarak değiştirmek B002AACD0A
değerini döndürür.
B002AACD0A > 978123456789 > 000000000000
ama
978123456789 > 000000000000 > B002AACD0A
DÜZENLEME 2 sıralarken: karşılaştırırken explicitely (order by NLSSORT(x,'NLS_SORT=BINARY_AI')
) ikili sıralama kullanarak, sonuç B002AACD0A>978123456789>000000000000
ve karşılaştırma davranışını eşleşir. Ama hala bunun neden olduğuna dair bir fikrim yok. karşılaştırmalar için davranış NLS_COMP
parametreye bağlıdır, oysa
kahin hangi sürümü size Hangi? Ben çok farklı bir şey görüyorum ... Ben ilk sorgulama ile 000000000000, 978123456789, B002AACD0A, sonra nerede uncommented 978123456789, B002AACD0A olsun. Verim 10.2.0.3.0. – greghmerrill
10.2.0.4.0 kullanıyorum. Muhtemelen farklı davrandığını görmek beni şaşırtmadı, muhtemelen 'NLS_SORT' ayarı ile ilgili (benim durumumda, 'ALMAN'). Ama her neyse, ben sıralamak ve tek bir sorgu içinde benzer bir şekilde davranmak karşılaştırmak istiyorum ... –
9.2.0.7.0, 10.2.0.1.0, 11.2.0.1.0 ve 11.1.0.6.0 (yok sor) tüm iade 000000000000, 978123456789, B002AACD0A ... – Ben