MySQL : la limite des 1000 caractères pour un index unique

MySQL : contourner la limite des 1000 caractères pour un index uniqueJe suis en train de concrétiser, enfin, l’écriture d’un moteur de recherche que j’avais en projet depuis de nombreuses années. Il m’a fallu choisir un moteur de bases de données et mon choix s’est assez vite porté sur MySQL / MariaDB pour la simple raison qu’il a été utilisé à l’origine du projet Google. Et l’éditeur a très largement contribué à l’améliorer, avant qu’il ne décide de s’en affranchir totalement. Je tiens à préciser que je n’ai pas besoin de la partie relationnelle et que j’ai fait le choix de tables au format MyISAM / Aria.

La limite des 1000 caractères pour les index uniques

Il est impossible d’associer une contrainte d’unicité dans MySQL / MariaDB sur un champ de plus de 1000 caractères. Or, comme les adresses Http/Https/Ftp peuvent aller jusqu’à 2000 caractères, il faut trouver une autre solution. La solution que j’ai choisie, c’est d’associer un hash MD5 à l’adresse que j’ai passé en index unique ! La colonne ne représente plus qu’un longueur de 32 caractères. CQFD.

La fonction MD5 dans MySQL / MariaDB

L’utilisation de la fonction MD5 est très bien expliquée dans la documentation MySQL :

SELECT MD5('https://www.dsfc.net/');
+----------------------------------+
| MD5('https://www.dsfc.net/')      |
+----------------------------------+
| 949a65833e197145428e9ed18710ddb1 |
+----------------------------------+

La fonction md5 dans PHP

Comme je vais écrire mon module d’exploration en PHP, je vais être également être amené à utiliser la fonction md5 du PHP :

php -r "echo md5('https://www.dsfc.net/');"
949a65833e197145428e9ed18710ddb1

Vous pouvez également utiliser la fonction hash :

php -r "echo hash('md5','https://www.dsfc.net/');"
949a65833e197145428e9ed18710ddb1

Comme vous pouvez le remarquer, les deux valeurs obtenues en PHP et sous MySQL / MariaDB sont rigoureusement identiques. Ouf ! ;+)

 

Php / , , , ,