Order by Sortierung von Sonderzeichen

Ich habe in der Datenbank die Zeichen * Ascii Code 45 und - Ascii Code 42.
Führe ich einen order by mit Sortierung durch erscheint zuerst * und dann -.

psql=# select ascii(index), cast(index as varchar(254)),cast(text as varchar(254)) from table
psql=# where name = ‘Translation’
psql=# order by index asc fetch first 5 rows only;
ascii | index | text
-------±-------±---------
45 | - | -
42 | * | Alle
48 | 01 | 01
48 | 02 | 02
48 | 03 | 03
(5 Zeilen)

was exakt ist jetzt die Frage?

Willst Du nach ascii() sortieren?

test=*# select ascii(idx), * from jzi order by idx ;
 ascii | idx 
-------+-----
    45 | -
    42 | *
(2 rows)

test=*# select ascii(idx), * from jzi order by ascii(idx) ;
 ascii | idx 
-------+-----
    42 | *
    45 | -
(2 rows)

Ja, ich will nach ASCII sortieren.
Welche Sortierung ist nicht nach ASCII???
Wie soll ich denn Text sortieren?
bzw. wo ist definiert wie PostgreSQL Text sortiert?
Also ist a<A?

Welche Sortierung ist nicht nach ASCII???

In einer Datenbank kann man die Sortierung einstellen. In verschiedenen Ländern wird auch unterschiedlich sortiert, das wird z.B. über die Ländereinstellungen geregelt. Man kann das AFAIK auch selbst definieren.
https://www.postgresql.org/docs/current/collation.html
Wir hatten so eine Sache mal bei einer Oracle, man betritt da einen Weg voller Schmerzen ;).
Gruß Uwe

Ich kann für meine Query anders sortieren.
Das löst die Wurzel des Problems nicht, sondern ist eine Umgehung.
Ist es das Betriebssystem mit Windows10 mit de-DE oder liegt es an PostgreSQL Installation. Ich will verstehen, wieso dieses Sortierergebnis entsteht.
Zumal ASCII, UTF-8, Windows1252 und ISO8859-1 in diesem Bereich gleich aussehen.

Das sind Encodings - die definieren wie die Zeichen repräsentiert werden. Die Sortierreihenfolge wird aber über die Collation definiert. Standardmäßig nimmt Postgres die vom Betriebssystem. Aber Du kannst ja mal versuch ob eine Sortierung strikt nach 8bit ASCII das ist, was Du erwartest:

order by "index" asc collate "C"

(index ist übrigens ein Schlüsselwort - Du tust Dir selber einen Gefallen, wenn Du einen anderen Namen für die Spalte findest)


Der cast zu varchar(254) ist übrigens ziemlich sinnlos da die beiden Spalten offensichtlich schon “Text” enthalten. Und eine maximale Länge von 254 hat absolut keinen Vorteil in Punkte Speicher oder Performance verglichen mit z.B. 257 oder 314

In PSQL mi \l ergibt sich eine Kodierung von UTF8 mit Sortierfolge German_Germany.1252.

Name | Eigent³mer | Kodierung | Sortierfolge | Zeichentyp | Zugriffsprivilegien
-----------±-----------±----------±--------------------±--------------------±----------------------
Db | postgres | UTF8 | German_Germany.1252 | German_Germany.1252 |

Ich habe die UCA Sortierung mit Unicode gefunden.
Siehe http://www.unicode.org/Public/UCA/6.1.0/allkeys.txt
Damit ist das Zeichen 0x2A Asterisk 036D größer als 0x2D Hyphen-Minus 020E.

002A ; [*036D.0020.0002.002A] # ASTERISK
002B ; [*059C.0020.0002.002B] # PLUS SIGN
002C ; [*0221.0020.0002.002C] # COMMA
002D ; [*020E.0020.0002.002D] # HYPHEN-MINUS