Base de données MySQL avec des champs uniques ignorant les espaces de fin
Les bases de données MySQL ignorent par défaut les espaces de fin lors de la comparaison de chaînes. Cela peut être problématique lorsque vous avez des champs uniques qui doivent prendre en compte l'espacement.
Considérez la définition de tableau suivante :
<code class="sql">CREATE TABLE strings ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, string varchar(255) COLLATE utf8_bin NOT NULL, created_ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY string (string) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;</code>
Si vous essayez d'insérer le mot « pomme » avec un espace sur à gauche, il sera stocké comme prévu. Cependant, si vous essayez d'insérer le mot avec un espace à droite, l'espace de fin sera supprimé avant de le stocker.
Solution potentielle
Une solution potentielle consiste à ajouter un caractère spécial à droite du mot après l'espacement. Cependant, cette approche introduit une complexité supplémentaire et n'est pas toujours pratique.
Solution proposée
Une meilleure solution consiste à tirer parti des classements NO PAD de MySQL introduits dans MySQL 8.0. . Les classements de type NO PAD n'ignorent pas les espaces de fin lors de la comparaison de chaînes.
Pour créer un tableau avec un classement NO PAD, utilisez la syntaxe suivante :
<code class="sql">CREATE TABLE test_ws ( `value` VARBINARY(255) UNIQUE ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;</code>
Avec ce classement, vous pouvez insérer des valeurs avec et sans espaces de fin :
<code class="sql">INSERT INTO test_ws (`value`) VALUES ('a'); -- Inserts "a" INSERT INTO test_ws (`value`) VALUES ('a '); -- Inserts "a " SELECT CONCAT('(', `value`, ')') FROM test_ws; -- Output: -- (a) -- (a )</code>
Bien que cette approche résolve le problème des champs uniques ignorant les espaces de fin, il est important de noter que le tri sur une telle colonne se fera sur les valeurs d'octet, qui peuvent ne pas s'aligner aux attentes des utilisateurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!