По какой то непонятной для меня логики, в MySQL для текстовых полей по умолчанию используется collation из семейства *_ci
– т.е. case insensitive. Это означает, что при сравнении строк, регистр строк не учитывается и 'X' = 'x'
. При этом, уникальные индексы рассматривают эти же поля как case sensitive. В общем, полная чехарда. И подозреваю, что заодно, это еще и несоответствие ANSI SQL-92. Хотя MySQL плюет на стандарт уже давно.
В общем, что я хотел сказать: берегитесь и будьте начеку. Если вам действительно нужна проверка на case sensitive уникальность, ставьте полю collation типа *_bin
или *_cs
(*_cs
, как я понял есть только в очень новых версиях MySQL, в mysql-server-5.0
версии 5.0.32, что в Debian Etch, мне обнаружить их не удалось).
И еще один момент. Eсли у вас поле fieldA
, скажем, с collate utf8_general_ci
, а вы решили схитрить и написать select * from tableA where fieldA = 'blabla' collate utf8_bin
, то индекс, созданный для поля fieldA
, в таком запросе использоваться не будет.