Problème :
Dans une base de données MySQL, les champs uniques doivent garantir que il n'y a pas deux lignes qui aient la même valeur. Cependant, lors de l'insertion de données avec des espaces de fin dans un champ unique, les espaces sont ignorés, ce qui permet de stocker des valeurs en double. Cela pose un problème lorsqu'il est nécessaire de préserver les espaces de début et de fin dans les entrées utilisateur.
Solution :
Le problème sous-jacent provient de la gestion par MySQL des espaces de fin dans les comparaisons de chaînes. . Tous les classements MySQL sont de type PADSPACE, ce qui signifie que les espaces de fin sont ignorés dans les types de champs CHAR et VARCHAR. Ce comportement est destiné à garantir des comparaisons de chaînes cohérentes, mais il entre en conflit avec la nécessité de préserver les espaces de fin.
Pour résoudre ce problème, il existe deux solutions principales :
1. Stockez les données sous VARBINARY :
Au lieu d'utiliser des types de données textuels comme CHAR ou VARCHAR, envisagez de stocker les données sous VARBINARY. VARBINARY stocke les données sous la forme d'une séquence d'octets, en préservant tous les caractères, y compris les espaces de fin. Cela garantit que les champs uniques appliquent réellement l'unicité en fonction de la valeur exacte, y compris les espaces.
Exemple :
<code class="sql">CREATE TABLE test_ws ( `value` VARBINARY(255) UNIQUE );</code>
2. Utilisez les classements NO PAD (MySQL 8.0 et versions ultérieures) :
Les versions MySQL 8.0 et ultérieures ont introduit les classements NO PAD. Ces classements ignorent les caractères de remplissage lors des comparaisons de chaînes, y compris les espaces de fin. En utilisant un classement NO PAD, vous pouvez appliquer l'unicité en fonction de la valeur exacte, y compris les espaces de fin.
Exemple :
<code class="sql">CREATE TABLE test_ws ( `value` VARCHAR(255) UNIQUE COLLATE utf8mb4_0900_ai_ci );</code>
Remarque : Le tri des données basé sur des champs assemblés NO PAD peut donner des résultats inattendus car le tri s'effectue sur les valeurs d'octets plutôt que sur la séquence de caractères perçue.
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!