sql >> Databasteknik >  >> RDS >> Mysql

MySQL-databas med unika fält ignorerade slututrymmen

Problemet är att MySQL ignorerar efterföljande blanksteg när man gör strängjämförelse. Sehttp://dev.mysql.com/doc/refman/ 5.7/en/char.html

(Denna information gäller 5.7; för 8.0 ändrades detta, se nedan)

Sektionen för like operatorn ger ett exempel på detta beteende (och visar att like respekterar efterföljande blanksteg):

mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
+------------+---------------+
| 'a' = 'a ' | 'a' LIKE 'a ' |
+------------+---------------+
|          1 |             0 |
+------------+---------------+
1 row in set (0.00 sec)

Tyvärr den UNIQUE index verkar använda standardsträngjämförelsen för att kontrollera om det redan finns ett sådant värde, och ignorerar därför efterföljande blanksteg. Detta är oberoende av att använda VARCHAR eller CHAR , i båda fallen avvisas infogningen, eftersom den unika kontrollen misslyckas. Om det finns ett sätt att använda like semantik för UNIQUE kolla då vet jag inte det.

Vad du kan göra är att lagra värdet som VARBINARY :

mysql> create table test_ws ( `value` varbinary(255) UNIQUE );
Query OK, 0 rows affected (0.13 sec)

mysql> insert into test_ws (`value`) VALUES ('a');
Query OK, 1 row affected (0.08 sec)

mysql> insert into test_ws (`value`) VALUES ('a ');
Query OK, 1 row affected (0.06 sec)

mysql> SELECT CONCAT( '(', value, ')' ) FROM test_ws;
+---------------------------+
| CONCAT( '(', value, ')' ) |
+---------------------------+
| (a)                       |
| (a )                      |
+---------------------------+
2 rows in set (0.00 sec)

Det är bättre att du inte vill göra något som att sortera alfabetiskt i den här kolumnen, eftersom sortering kommer att ske på bytevärdena istället, och det kommer inte att vara vad användarna förväntar sig (de flesta användare i alla fall).

Alternativet är att patcha MySQL och skriva din egen kollation som är av typen NO PAD. Inte säker på om någon vill göra det, men om du gör det, låt mig veta;)

Edit:under tiden har MySQL kollationer som är av typen NO PAD, enligt https://dev.mysql.com/doc/refman/8.0/en/char.html :

och https://dev.mysql.com/ doc/refman/8.0/en/charset-unicode-sets.html

Så om du försöker:

  create table test_ws ( `value` varbinary(255) UNIQUE )
    character set utf8mb4 collate utf8mb4_0900_ai_ci;

du kan infoga värden med och utan efterföljande blanksteg

Du kan hitta alla tillgängliga NO PAD-kollationer med:

 show collation where Pad_attribute='NO PAD';


  1. Hur får man bara tabeller, inte vyer med hjälp av SHOW TABLES?

  2. Välja en enda rad i MySQL

  3. MySQL:välj det första elementet i en kommaseparerad lista

  4. SQLiteException:Okänd token vid läsning från databasen