Hallo mensen,

Ik heb een veld (INT) ingesteld als FOREIGN KEY naar een autoincrement veld (INT).
Maar als ik nu ORDER BY veld doe dan wordt dat alfabetisch gedaan en niet numeric.

Dus zo:
100
15
21
23
36
38
44
46
57
68

Weet iemand hoe dat komt?
En hoe op te lossen?

Groetjes,
Thanks.
Maar dat is voor MariaDB.
Ik heb mySQL en die heeft dat helaas niet.

Het gekke vind ik dat het allemaal getallen (INT) zijn en toch wordt het als tekst behandeld.

[size=xsmall]Toevoeging op 02/04/2023 14:18:46:[/size]

Het ophalen van de veldwaarde stond in een if(..., '', veldwaarde) statement.
Ik heb de if() verwijderd en nu gaat het wel goed.
Lijkt er op dat het kwam doordat er een lege string staat in de if().

Raar maar waar.
Het werkt nu dus.

Groetjes,

SanThe.
Ja die had ik ook reeds gevonden.
Bedankt voor de hulp.
Maar zoals ik hierboven heb geschreven is het opgelost.
Ik heb de if() anders gemaakt.
En nu staat het bewuste veld niet meer in de if() en werkt het goed.

SanThe.
MySQL doet wat PHP ook doet, het werkt met impliciete type casts. Dat IF()-statement zette zonder dat je het in de gaten had, de waardes om van int naar strings. Weghalen van het if()-statement haalt de oorzaak van het probleem weg.
Het komt omdat de constructie if(..., '', veldwaarde) integers combineert met strings. MySQL kan wel alle ints omzetten naar strings, maar niet andersom, vandaar.

Desondanks kan je een string kolom wel sorteren alsof het integers betreft.
In de link https://www.mysqltutorial.org/mysql-natural-sorting/ staat het voorbeeld:

ORDER BY CAST(kolom_met_strings AS UNSIGNED)


Wanneer je strings sorteert in een database, moet je iets weten over collaties. Maak je bijvoorbeeld gebruik van UTF-8 (utf8mb4) dan gebruikt MySQL de standaardcollatie utf8mb4_0900_ai_ci. Je kunt een standaardcollatie instellen voor de hele database, per tabel en zelfs per kolom. Stel je wilt kastongevoelig sorteren op de standaard Unicode manier, dan gebruik je de collatie utf8mb4_unicode_ci:

ORDER BY kolom_met_strings COLLATE utf8mb4_unicode_ci;

Je hoeft de collatie alleen op te geven wanneer deze afwijkt van de standaardcollatie.
Ik heb even getest.
Als ik de lege string in de if() vervang door 0 werkt het ook gewoon.
Dat is fijn.

Als je 0 gebruikt om een missende waarde aan te geven kan je ook met NULL werken. Dat zou ook goed moeten gaan in het if()-statement.

Reageren