Архив метки: MySQL

Поиск по русским буквам в mysql (проблема "е" и "ё" в utf-8)

Была задача найти все слова, начинающиеся на определенную букву. Казалось бы, что может быть проще?)

Стоит отметить, что сайт на utf-8, таблицы в utf8_general_ci. Начал я с простого: для передачи ссылка (с GET запросом для сортировки по определенной букве, типа «http://sky2high.net/sort.php/?letter=Ю«) проходила через php-ое urlencode(), а на приеме через urldecode(), на выходе которого получаем необходимую букву.

Сначала скрипт выборки из БД был типа такого:

SELECT name, lat_name, video
FROM ru_words AS w
WHERE w.name LIKE "{$letter}%"
ORDER BY w.name

И всё бы хорошо, но БД выдавала одинаковые результаты для букв «е» и «ё». Тут я и впал в ступор, стал гуглить. Оказалось, что это ошибка mysql-server-5.0.xx, рекомендовали апгрейдить на 5.1 (а на боевом сервере стоит mysql 5.0.xxx), что, конечно, есть большой геморр, особенно в виду отсутствия deb-пакетов для ubuntu 8.04 LTS, что значит надо собирать из исходников, заново настраивать, импортировать БД и т.д..

Далее, вспомнил про прекрасный оператор REGEXP в SQL запросах (и правильно сделал! — прим. КО), однако запрос типа

SELECT name, lat_name, video
FROM ru_words AS w
WHERE w.name REGEXP "^{$letter}"
ORDER BY w.name"

Не дал результатов, то есть вообще никаких, слова перестали находится. Не знаю зачем (ведь перед глазами постоянно мелькало из документации «REGEXP ведет НЕ РЕГИСТРОЗАВИСИМЫЙ поиск»), но всё-таки попробовал передать в запросе поиск не по заглавной букве, но по прописной.

$letter = mb_strtolower((urldecode($letter), 'UTF-8')

И мини-чудо озарило мой экран: поиск стал просто идеально идти по всем буквам.

Выводы: даже и не знаю какие. Доверять, конечно, надо документации, но и проверять.

gem install mysql problem

Ставил я новый Redmine на свой сервер, ставил на платформу Ruby Enterprise + mod_passenger + Apache 2 и  всё хорошо, только ругался сильно неприлично компилятор, когда я попросил «gem install mysql»:

Installing mysql...
/opt/ruby-enterprise-1.8.6-20090610/bin/ruby /opt/ruby-enterprise-1.8.6-20090610/bin/gem install -r --no-rdoc --no-ri --no-update-sources --backtrace mysql
Building native extensions. This could take a while...
ERROR: Error installing mysql:
ERROR: Failed to build gem native extension.

/opt/ruby-enterprise-1.8.6-20090610/bin/ruby extconf.rb
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lm... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lz... yes
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lsocket... no
checking for mysql_query() in -lmysqlclient... no
checking for main() in -lnsl... yes
checking for mysql_query() in -lmysqlclient... no

и т.д.

Погуглив выяснил, что эта ошибка говорит о том, что компилятор не находит соответствующих хедеров (библиотек) для компиляции, нужен пакет типа libmysqlclient-dev. Для моей версии mysql нужен был пакет libmysqlclient15-dev. Соответственно в консоли:

apt-get install libmysqlclient15-dev

и торжественное

gem install mysql