Задавайте вопросы, мы ответим
Вы не зашли.
Доброго дня .
Коллеги, поделитесь соображениями плиз.
mysql> select version(); +------------+ | version() | +------------+ | 5.1.52-log | +------------+ 1 row in set (0.00 sec)
mysql> create table uniq_test( val varchar(255), unique key val_key(val) ); Query OK, 0 rows affected (0.26 sec) mysql> insert into uniq_test value(''); Query OK, 1 row affected (0.00 sec) mysql> insert into uniq_test value(''); ERROR 1062 (23000): Duplicate entry '' for key 'val_key' mysql> insert into uniq_test value(' '); ERROR 1062 (23000): Duplicate entry ' ' for key 'val_key'
Первая ошибка - логична и понятна. Но когда я пытаюсь вставить не пустую строку, а пробел - тут непонятно - ведь это же разные строки?
mysql> insert into uniq_test value(' f '); Query OK, 1 row affected (0.00 sec) mysql> insert into uniq_test value(' f '); ERROR 1062 (23000): Duplicate entry ' f ' for key 'val_key'
Опять же - строка, где после f два пробела отличается от строки, где после f один пробел.
В чем дело может быть?
Неактивен
Для varchar пробелы сохраняются, в отличие от CHAR.
http://dev.mysql.com/doc/refman/5.5/en/char.html
VARCHAR values are not padded when they are stored. Trailing spaces are retained when values are stored and retrieved, in conformance with standard SQL.
При этом индекс строится на значении CHAR(255), которое получается из VARCHAR дополнением пробелами до нужной длины. Значения разные, но для индекса они становятся одинаковыми.
Неактивен