Maison > base de données > tutoriel mysql > le corps du texte

Comment appliquer des champs uniques dans MySQL tout en préservant les espaces de fin ?

Susan Sarandon
Libérer: 2024-11-03 09:38:02
original
1042 Les gens l'ont consulté

How to enforce unique fields in MySQL while preserving trailing spaces?

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal