Информация о настройке кодировок в MySQL
Misha v.3 [27 сентября 2002]
Итак светлое будущее, о котором так долго говорили большевики наступило и появился MySQL 4.1x с поддержкой подзапросов и большего количества кодировок (в том числе с встроенной поддержкой UTF-8 и возможностью иметь разные кодировки на разные базы данных, таблицы и даже столбцы).
В рамках этого светлого будущего в случае использования MySQL 4.1x мы почти не зависим от настроек сервера, т.к. кодировку своей БД вы можете выбрать сами.
Начну с того что любимую команду:
SET NAMES xyz
и её парсерную интерпретацию в виде ?charset=xyz никто не отменял, и эта команда позволяет нам задать кодировку, в которой мы хотим получать данные от MySQL сервера.
Следует заметить, что в MySQL 4.1x она задает именно кодировку в которой данные будут отправляться клиенту, и вы можете указать любую удобную вам кодировку.
Поэтому сейчас мне кажется разумным в качестве серверной кодировки использовать UTF-8, а в качестве клиентской - кодировку, в которой вы храните файлы и использовать ?charset=кодировка_файлов в строке подключения. Почему UTF? Да потому что завтра вы захотите хранить в той же базе данных кроме русских и английских букв ещё французские/немецкие/... и вам не нужно будет ничего делать с базой данных, т.к. она уже будет готова к хранению букв на разных языках. Хотя в случае использования кодировки win1251 как кодировки вашей базы данных в общем тоже особых проблем не будет: вы сможете сделать dump вашей БД, изменить её кодировку и загрузить данные обратно. Всего-то делов.
Теперь про чувствительность MySQL к регистру.
Как было замечено в документации с помощью
, работа MySQL со столбцами типа CHAR, VARCHAR по умолчанию не чувствительна к регистру, т.е. если у вас в таблице есть записи а, А, Б, б, В то при сортировке они вернутся в следующем порядке: аАбБВ, а SELECT DISTINCT name FROM test ORDER BY name что-то типа: а Б В
Для того, чтобы получить результаты упорядоченными так:АБВаб (и SELECT DISTINCT ... в виде АБВаб) необходимо на столбец установить атрибут BINARY, тогда сравнение данных, хранящихся в нем будет происходить с учетом регистра.