# Sortierung Java vs DB



## SlaterB (29. Aug 2012)

hallo,

ich sortiere Text-Daten in der DB und dieselben Daten auch Java,
z.B. hole ich mir zwei Iteratoren über lange Datenströme nach einer textuellen Id,
und gleiche den Stand der Iteratoren ab 
"Iterator B, laufe bis zu Eintrag X von A, falls vorhanden, überspringe in Sortierung kleinere, gehe nicht weiter"

dabei stören mich die verschiedensten Sortierunterschiede, null anders 
(vorne oder hinten, wobei String.compareTo() an sich sowieso schon streikt),
Kleinbuchstabe vor Großbuchstaben statt andersum, 
gerade habe ich # vor Zahlen statt andersrum entdeckt 
und wer weiß was es noch gibt

ich sollte wohl mal alle relevanten Zeichen in eine Tabelle einfügen und das sortierte Ergebnis anschauen

gibt es schon fertige Auflistungen, vielleicht schon für Java einen passenden Comparator
oder ganz andere Vorschläge/ Erfahrungen dazu?


----------



## SlaterB (29. Aug 2012)

das # ist ja verrückt, hat das eine definierte Sonderrolle?
inzwischen klemmt schon meine entsprechende Taste..


```
b#
b#0
b0
b##00
b#0#0#
b#00
b00
b0#0#0
b000
b#01
b01
b#1
b1
b#21
b#22
b22
b#23
b33
```
bei Oracle geht ja noch, da wird # anscheinend einfach ignoriert, wenn aber der Rest dahinter gleich ist, kommt der Eintrag mit # weiter nach vorne,
allzu viele Kombinationen mit # selber habe ich lieber noch nicht angeschaut

-----


```
b#
b0
b#0
b##0
b###0
b#00
b##00
b#0#0
b00
b000
b00#0
b00#00
b0000
b00000
b#01
b01
b#02
b1
b2
b#2
b#22
b22
b#23
b3
b#3
b#333
b333
b#44
b44
b#444
b444
```
bei Postgres dagegen schlimmer, wenn nur ein Zeichen nach dem # folgt, etwa b2 zu b#2, dann ist der #-Eintrag weiter hinten,
wenn aber mehr Zeichen folgen, etwa b22 zu b#22, dann der #-Eintrag nach vorne??

an Einfüge-Reihenfolge bei vermeintlicher Gleichheit liegts nicht und DESC-Sortierung liefert gegen entgegengesetzes Verhalten


----------



## nillehammer (29. Aug 2012)

Interessante Fragestgellung. Das habe ich noch nie hinterfragt. Ich habe es immer die Datenbank machen lassen, ohne auf Inkonsistente Reihenfolgen zwischen Java- und DB-Sortierung zu achten. Bin auf die Ergebnisse gespannt.


----------



## gp (29. Aug 2012)

Sortierung ist eine Sache für sich:

der Duden macht es anders als das Telefonbuch
Österreich anders als Deutschland
andere Kulturen machen eh was sie wollen

Nur mal so - zur Anregung :autsch:

Welcher Zeichensatz ist in deinem Textfeld? Unicode, Windows, oder was auch immer? Wie ist die Sortierung der Datenbank eingestellt. Ist die Sortierung nutzerabhängig?

Erwarte jetzt bitte keine Lösung - es kommt halt immer darauf an.

Für schwierige Fälle, insbesondere wenn die Anwendung international wird (aber so richtig: mit Russen, Chinesen und Persern), bleibt wohl nur eine Sortierung der (Unicode-) Texte über eigene Java-Routinen. Vor allem wenn die Sache noch datenbankunabhängig bleiben soll.

Günter


----------



## Marco13 (30. Aug 2012)

Ich hab' keine Ahnung davon (und WIE wenig, habe ich erst gemerkt, als ich versucht habe, trotzdem eine mögliche Antwort zu finden) aber ... bei c# string sorting VS Oracle string sorting - Stack Overflow hatte jemand das Problem für C#. Dort ist dieses "NLS_SORT" bzw. "NLSSORT" beschrieben (wtf ist der Unterschied?) ... Sowas wie Datatype Comparison Rules könnte interessant sein, hilft aber nicht unmittelbar. Kann es sein dass das '#' so eine Art "Escape-Character" ist...? :bahnhof:

EDIT: BTW, ich nehme an, dass die eigentliche Schwierigkeit die ist, eine allumfassende und Verbindliche Definition der Sortierregeln für die DB zu finden ( bzw. für die verschiedenen DBs ). Die dann als Comparator in Java umzusetzen wäre im Idealfall ja eher eine Fleißarbeit. Wenn es aber um die umgekehrte Richtung geht, nämlich der DB zu sagen, "welchen Comparator" sie verwenden soll, kann ich NOCH weniger dazu sagen....


----------



## SlaterB (30. Aug 2012)

es betrifft wohl viele Sonderzeichen, inklusive - und _
im Moment vermute ich alles außer Ziffern, Groß- und kleinbuchstaben

dass es irgendeine abweichende Reihenfolge gibt wäre ja noch ok, aber Zeichen quasi auslassen?
wobei ich dann unter verschiedenen 'Auslassungsvarianten' immer noch Reihenfolge herstellen muss..

selbst mit Auslassen ist Oracle wenigstens konsistent, aber Postgres macht mich noch verrückter,
kann irgendjemand in irgendeiner DB erstmalig bestätigen oder wiederlegen, ob
> b01
> b_02
> b03
so sortiert wird oder anders?

Datatype Comparison Rules
führt alle Zeichen auf, auch #, aber nichts von komischer Behandlung die Rede

----

ich dachte zunächst noch, in der DB den Text mit replace() für die Sortierung zu ändern, nur bei # noch halbwegs praktikabel,
aber gibt ja viele Zeichen, und Aufwand auch gar nicht schön

jetzt werde ich wohl bald rangehen und jede noch so kleine Besonderheit pro DB in Java-Comparator nachbilden,
inklusive einer Tabelle mit 100 Testeinträgen, in jeder DB am Anfang sortiert und mit Java-Sortierung verglichen, 
um gleich jede Besonderheit wie umgestellte Locale automatisch zu melden..


----------



## Evil-Devil (30. Aug 2012)

SlaterB hat gesagt.:


> kann irgendjemand in irgendeiner DB erstmalig bestätigen oder wiederlegen, ob
> > b01
> > b_02
> > b03
> so sortiert wird oder anders?



MySQL (5.1) - MyISAM (latin1)

Aufsteigend sortiert:
b01
b03
b_02


----------



## mvitz (30. Aug 2012)

H2 aufsteigend:
b01
b03
b_02

SQLite aufsteigend:
b01
b03
b_02

Oracle 10.2.x.x aufsteigend:
b01
b03
b_02


----------



## SlaterB (30. Aug 2012)

hmm hmm, besonders bei Oracle,
ich habe 11.1.x, aber an einen solchen Unterschied durch Version mag ich kaum glauben, eher Konfiguration..


----------



## Evil-Devil (30. Aug 2012)

Naja, wenn man auf eine ASCII Tabelle schaut würde die Sortierung von Sonderzeichen vor den Alphanumerischen Zeichen schon Sinn machen, denn die kommen fast alle vorher vor in der Liste.
Ascii Table - ASCII character codes and html, octal, hex and decimal chart conversion

Allerdings ist es fraglich ob man die Sortierung noch irgendwie außer über CI/CS /Collation /Hacks beeinflussen kann.


----------



## SlaterB (30. Aug 2012)

vor oder nach wäre mir langsam wirklich gleich, ZWISCHEN ist ein Problem


----------



## Spacerat (30. Aug 2012)

Also ich hab' immer angenommen, dass ein Computer eigentlich nur "Zahlen" sortiert, also ASCII, UTF, EBCDIC...
UTF und ASCII unterscheiden sich in den ersten 127 Codes ja nicht, wohl aber EBCDIC und ASCII.
ASCII-Reihengolge: Zeichen, Ziffern, Buchstaben,
EBCDIC-Reihenfolge: Zeichen, Buchstaben, Ziffern... 
Auf der verlinkten Oracle-Seite fehlen die Einträge der EBCDIC-Ziffern (240-249), aber dass würde im Zweifelsfalle höchstens erklären, dass bei EBCDIC die Ziffern vor den Buchstaben liegen, die Zeichen liegen ja in allen Fällen vorne. ???:L:bahnhof:


----------



## xote (11. Sep 2012)

Marco13 hat gesagt.:
			
		

> Kann es sein dass das '#' so eine Art "Escape-Character" ist...?


Ich glaube nicht, dass er nach den Unicode Escape-Sequenzen sortiert , also von \u0000 bis \uffff. Ich wäre mir jetzt auch gar nicht sicher, ob die zur Laufzeit vorkommen, denn meines Wissens nach werden Escape-Sequenzen vor der eigentlichen Interpretation des Quelltextes ausgetauscht. Der Compiler sieht das schon gar nicht mehr und damit auch nicht das JAVA Programm. Denke ich mir halt.

Aber ich denke wohl, dass da nach irgendwas sortiert wird. Willkürlich ist eher nicht.


----------



## SlaterB (11. Sep 2012)

wie gesagt betrifft es dann auch quasi alle Sonderzeichen, jedenfalls die paar geläufigen die ich getestet habe, - _ ; . usw.
# keine besondere Bedeutung mehr

ich hatte mir zu Hause Postgres installiert, da gab es kein Problem,
wird wohl irgendeine seltsame Einstellung im 'Rechenzentrum' auf der Arbeit sein,
dazu passt dass Oracle und Postgres mehr oder weniger gleichmäßig betroffen sind

> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
liefert 'WE8ISO8859P15'

aber
Oracle in World: Difference between WE8ISO8859P1 and WE8ISO8859P15 characterset
ist zwar mal ein Artikel nah an einzelnen Zeichen, schreibt dennoch nichts von solchen Merkwürdigkeiten,

die Frage ist quasi auch ob überhaupt irgendwelche Einstellungen bekannt sind, um so etwas zu erreichen


----------



## FerFemNemBem (18. Sep 2012)

Mahlzeit,



SlaterB hat gesagt.:


> die Frage ist quasi auch ob überhaupt irgendwelche Einstellungen bekannt sind, um so etwas zu erreichen



Ja, und zwar (bei Oracle):

```
alter session set nls_sort=german;
```

Damit bekomme ich Deine "Unsortierung" auch hin. Wenn man den default: "nls_sort=binary" laesst, wird so sortiert, wie man sich das denkt/wuensch/erhofft.

Gruss, FFNB.


----------



## SlaterB (18. Sep 2012)

so ist das also


----------



## FerFemNemBem (18. Sep 2012)

Mahlzeit,

Da werden bei der Sortierung Diakritische Zeichen ignoriert. Etwas mehr von Oracle zu dem Thema gibts hier. Aber das hattest Du dann sicher auch schon gefunden...

Gruss, FFNB.


----------



## SlaterB (18. Sep 2012)

auch noch nicht gefunden, danke


----------

