Любимая бага MySql 5.0.4* (cp1251)

Модератор: Модераторы разделов

NaTTs
Сообщения: 199
Статус: simply maniac
ОС: openSuSE 11.1 x86

Любимая бага MySql 5.0.4*

Сообщение NaTTs »

Итак.. сам я эту электронную записную книжку не пользую уже около года, а тут вдруг понадобилось устроить небольшой maintance проекта на mysql. Так вот.. сначала были ошибки при выдаче киррилических данных из базы (вопросительные знаки). Решается путем отправки "SET CHARSET cp1251". Но когда я делаю Insert киррилических данных, все равно получаю в базе вопросительные знаки. Это не utf, а именно сплошные вопросительные знаки. где подвох? может делать на входящие данные iconv из utf и проверить? (локаль системы utf8, если это важно, в чем я не сильно уверен)
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Любимая бага MySql 5.0.4*

Сообщение sergio »

Так вот.. сначала были ошибки при выдаче киррилических данных из базы (вопросительные знаки).

Мне почему-то кажется, что это любимая бага не МуСкль, а пионеров веб-разработки, которые сперва данные вставляют, потом по всем форумам вопросы задают (где находят у БД "любимую багу", "решение" которой они уже героически открыли), и даже после всего этого документацию не читают. :happy:
Как минимум - не указали чем, откуда и в какой кодировке вы делаете "инсерт кириллических знаков".
А так, по идее, в таблицу пишутся те данные, которые вы передали. Установка чарсета подстраивает функции сортировки и проч. для работы с текстом. Соотв-но после установки чарсета весьма вероятно что надо таблицу очистить и все данные вставить по-новой, и вставлять в соответствующей кодировке. Я так подозреваю. Что документация по этому поводу говорит?
А вообще, тема наверняка поднималась в каждом русском форуме по веб-разработкам по сто двадцать раз - неужели поиск не помогает? :happy:

Смотрите, какие ссылки красивые, одна к другой как на подобор, десять штук и все ваши:
http://www.yandex.ru/yandsearch?text=MySQL...set&rpt=rad
(запрос "MySQL проблема с русскими кодировками charset") :3a:


Есть и такое мнение:


MySQL 4.1 на внутреннем уровне работает с кодировкой UTF-8 и перекодирует результат в требуемую форму (в нашем случае windows-1251) непосредственно перед передачей его клиенту (т.е. скрипту). В некоторых случаях оказывается, что кодировка клиента (скрипта) «не доходит» до MySQL. Соответственно, сервер передает «вопросики». Можно применить одно из следующих решений. 1. Вписать в скрипт что-то вроде: mysql_query(«SET NAMES cp1251») . Это надо делать сразу же после подключения к MySQL. Проблема исчезнет (хотя правильнее будет установить переменные сессии). 2. Вписать init-connect="SET NAMES cp1251" в my.ini и перезапустить MySQL. Однако это сработает только для соединений, которые проходят НЕ под root-пользователем. Скрипты, коннектящиеся к базе под root, по-прежнему будут получать неверную кодировку. Лучше всего будет все-таки завести новую базу и пользователя и забыть о проблеме подключаясь через его аккаунт. Чтобы диагностировать проблему, выполните в скрипте запрос SHOW VARIABLES LIKE 'char%'.

Пример:

Код: Выделить всё

mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | cp1251 |
| character_set_results | latin1 |
| character_set_server | cp1251 |
| character_set_system | utf8 |
| character_sets_dir | usr/local/mysql4/share/charsets |
+--------------------------+----------------------------------+
7 rows in set (0.00 sec)

Как видите, кодировка неверная: character_set_client=latin1. Это из-за того, что я подключился к базе под root. Если теперь подключусь под НЕ-root пользователем – все будет нормально.


Видите, как много уже найдено всего до вас в битве с силами тьмы. :bones:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали: