Stockage des zéros d'entiers en base de données MySQL comme un ENTIER
J'ai besoin de MySQL pour stocker les valeurs dans un champ de type entier et maintenir les zéros non significatifs. Je ne peux pas utiliser l'option zerofill ne que mon champ est de type Bigint(16), et les chiffres peuvent varier d'un montant de zéros. C'est à dire: 0001 - 0005, puis 008 - 010 peuvent avoir besoin d'être stockées. Je ne m'inquiète pas à propos de l'unicité de chiffres (ce ne sont pas utilisés comme Identifiants ou rien), mais j'ai encore besoin d'eux pour être stockées de préférence comme INTS.
Le problème à l'aide de CHAR/VARCHAR et puis typecasting les valeurs des entiers en PHP signifie que le tri des résultats par le biais de requêtes conduit à le tri alphanumérique, c'est à dire: TRIER PAR nombre ASC serait de produire des
001
002
003
1
100
101
102
2
Clairement pas dans l'ordre numérique, mais dans l'ordre alphabétique, ce qui n'est pas voulu.
L'espoir pour certains intelligente des solutions de contournement 🙂
- les entiers n'ont pas les zéros à gauche. Seuls les représentations de chaîne d'eux peut. Donc, si vous avez "besoin" zéros, vous aurez à stocker une représentation sous forme de chaîne. Pourquoi ne pouvez-vous pas faire ce genre de mise en forme au moment de l'affichage, plutôt que de le mettre dans la base de données?
- 1 et 001 et des valeurs différentes. Mais comme int, elles sont les mêmes: comment devraient-ils être triés et comparé? comme int ou varchar?
Vous devez vous connecter pour publier un commentaire.
Garder les nombres stockés en tant que nombres entiers.
Puis utilisez la fonction
LPAD()
afficher les nombres (à gauche), des zéros:Si le nombre de zerofill ne caractères est variable, ajouter une autre colonne de la table (zerofill ne) de longueur.
Vous pouvez toujours trier la chaîne de caractères(CHAR/VARCHAR) colonnes, comme entier en utilisant CAST
Ainsi, vous pouvez les stocker dans des CHAR/VARCHAR type de champs.
ORDER BY col_name + 0 DESC
pour trier une colonne varchar comme entierVous ne pouvez pas stocker entier avec des zéros à gauche. Une façon est de les garder dans varchar ainsi que les colonnes int. Dans ce cas, vous avez besoin de deux colonnes, une valeur et les autres intValue et alors que le tri, vous pouvez utiliser le intValue pour le tri. C'est facile à mettre en œuvre.
L'autre option peut être à l'aide de deux colonnes, l'une valu et othe NumOfZero et de les utiliser pour obtenir les résultats souhaités. C'est complexe, mais peut-être la lumière sur la DB.
Changement de la structure du champ et de faire les Attributs
UNSIGNED_ZEROFILL
de conserver les zéros.Mais vous devriez faire attention à la Longueur du champ, parce qu'il va revenir tout le reste nombre de zéros afin de mettre la durée de votre champ