Uniвсячина

понемножку о Linux и программировании

Проверка уникальности в MySQL

По какой то непонятной для меня логики, в 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, в таком запросе использоваться не будет.

Comments