156 votes

Génération d'une chaîne de 8 caractères unique et aléatoire à l'aide de MySQL

Je travaille sur un jeu qui implique des véhicules à un moment donné. J'ai une table MySQL nommée "véhicules" contenant les données sur les véhicules, y compris la colonne "plaque" qui stocke les plaques d'immatriculation des véhicules.

Maintenant, voici la partie avec laquelle j'ai des problèmes. Je dois trouver une plaque d'immatriculation inutilisée avant de créer un nouveau véhicule - il doit s'agir d'une chaîne alphanumérique aléatoire de 8 caractères. Pour y parvenir, j'ai utilisé une boucle while en Lua, qui est le langage dans lequel je programme, pour générer des chaînes et interroger la base de données pour voir si elle est utilisée. Cependant, à mesure que le nombre de véhicules augmente, je m'attends à ce que cela devienne encore plus inefficace que maintenant. J'ai donc décidé d'essayer de résoudre ce problème en utilisant une requête MySQL.

La requête dont j'ai besoin doit simplement générer une chaîne alphanumérique de 8 caractères qui n'est pas déjà dans la table. J'ai de nouveau pensé à l'approche de la boucle generate&check, mais je ne limite pas cette question à celle-ci, au cas où il en existerait une plus efficace. J'ai réussi à générer des chaînes de caractères en définissant une chaîne contenant tous les caractères autorisés et en la soustrayant de manière aléatoire, mais rien de plus.

Toute aide est appréciée.

7voto

Nikita G. Points 599

Pour générer une chaîne aléatoire, vous pouvez utiliser :

SUBSTRING(MD5(RAND()) FROM 1 FOR 8)

Tu reçois quelque chose comme ça :

353E50CC

5voto

J'utilise les données d'une autre colonne pour générer un "hash" ou une chaîne unique.

UPDATE table_name SET column_name = Right( MD5(another_column_with_data), 8 )

5voto

TV-C-15 Points 401

8 lettres de l'alphabet - All caps :

UPDATE `tablename` SET `tablename`.`randomstring`= concat(CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25)))CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))),CHAR(FLOOR(65 + (RAND() * 25))));

3voto

ekerner Points 1664

Si vous n'avez pas d'id ou de seed, comme c'est le cas pour une liste de valeurs dans l'insertion :

REPLACE(RAND(), '.', '')

3voto

Rick James Points 15994
UPPER(HEX(UUID_SHORT()))

vous donne une chaîne alphanumérique de 16 caractères qui est unique. Il y a quelques réserves improbables, voir https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_uuid-short

La valeur "suivante" est souvent prévisible :

mysql> SELECT UPPER(HEX(UUID_SHORT()));
+--------------------------+
| UPPER(HEX(UUID_SHORT())) |
+--------------------------+
| 161AA3FA5000006          |
+--------------------------+

mysql> SELECT UPPER(HEX(UUID_SHORT()));
+--------------------------+
| UPPER(HEX(UUID_SHORT())) |
+--------------------------+
| 161AA3FA5000007          |
+--------------------------+

La conversion en BASE64 permet de ramener la chaîne à 11 caractères :

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_to-base64

mysql> SELECT TO_BASE64(UNHEX(HEX(UUID_SHORT())));
+-------------------------------------+
| TO_BASE64(UNHEX(HEX(UUID_SHORT()))) |
+-------------------------------------+
| AWGqP6UAABA=                        |
+-------------------------------------+

Il y a 12 caractères, en enlevant le '=', on obtient 11 caractères.

Ceux-ci peuvent le rendre inadapté à votre utilisation : La plaque "suivante" est quelque peu prévisible. Il peut y avoir des signes de ponctuation ( + , / ) dans la chaîne. Les lettres minuscules sont susceptibles d'être incluses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X