Feb 21

Первично перенос данных был сделан не совсем правильно, просто были взяты папки(DB) скопированы в соответствующую директорию где новый сервер хранил свои базы данных и все.

По крайней мере на сайте все показывалось нормально, но были проблемы с правильной сортировкой по строковым полям. Причиной этого стало наследие кодировок latin от 3 версии, там все работало прекрасно и сортировка была правильной. Еще вроде бы в phpMyAdmin показавались кракозябры вместо русских букв. Но я phpMyAdmin ом особо не пользовался, мне больше нравился SQLyog. Через некоторое время обновил версию SQLyog-а, и тут началось. Русские буквы кракозябрами, insert и update прекращали данные в вопросики.

Если insert и update делать из php то все нормально.

Ситуация дозрела, нужно что то делать с кодировками. Если в таблице изменить кодировку строки из latin на cp1251 тогда сервак конвертит строку в вопросики, на эти грабли я уже наступал. Изучил содержимое файлов *.frm *.myd *.myi  выяснил что в *.myd лежат данные таблицы в кодировке cp1251 (она же windows-1251). Сделал копию всех файлов. Потом программой SQLyog поменял кодировку строковых полей во всех таблицах(в SQLyog выпадающее меню на таблице - команда AlterTable) . Естественно все русские строчки стали вопросиками. Переписал все файлы *.myd из копии. Перезапустил сервер MySQL, ура все по русски и в правильной кодировке, и везде.

В конце хочу сказать что кодировка в MySQL много где зашита:

  • Поля таблицы (AlterTable)
  • Свойство таблицы (Alter Table - Advanced Properties)
  • Свойство базы данных (Alter DataBase)

Итого: везде где только можно было выставил кодировку cp1251, но запрос

show variables where Variable_name like ‘%char%’;

Вернул следующее

query result

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/local/mysql/share/mysql/charsets/

Пусть не пугает наличие utf8, так и должно быть.

Теги: ,

May 26

Про пакет программ Дмитрия Котерова Denwer, встречал упоминания много раз. В этом месяце наконец случилось, взял на вооружение.

Денвер оказался очень удобной штукой, если его ставить на флешку. Считай что веб. сервер в кармане: apache, mysql, php - все настроено, и уже работает после запуска файла Run.exe на любом компьютере, даже где этот денвер не ставился. Например, у  заказчика вставил флешку, кликнул по Run.exe и можно уже обращаться по доменному имени проекта, кстати очень понравилось, что домены(проекты), вернее не не так, достаточно создать папку www.project.ru, а внутри ее в папке www создать index.php, перезапустить денвер, как уже в браузере можно обращаться к этому домену.

Есть еще какой то интересный наворот в виде сборщика отправляемой сайтом почты, но это я пока не опробовал.

Рекомендую !!! Взять безвозмездно можно на http://dklab.ru/

Теги: , , ,

Feb 07

Проблема состояла в том что dump сохранялся вопросиками, сортировка выполнялась сервером не по алфавиту, и это только основные причины.

Промучился с настройкой достаточно большое количество времени, перечитал кучу страничек.

Рекомендую ознакомиться:

Работа MySQL со строками
http://sqlinfo.ru/articles/info/2.html

Обновление сервера 3.23 и 4.0
http://sqlinfo.ru/articles/info/5.html

Проблемы с русским языком и как их решать
http://www.sql.ru/faq/faq_topic.aspx?fid=152

http://phpfaq.ru/charset

А вообще везде пишут что достаточно поставить

default-character-set=cp1251

Кое кто указывает еще

character-set-server=cp1251
collation-server=cp1251_general_ci

Но на данных настройках mysql не выдавал правильно русские буковки на сайте и в утилите SQLyog.

А в SQL Manager for MySQL выдавал правильно :-)

Решение:

В раздел [mysqld] необходимо добавить следующее:

default-character-set=cp1251
character-set-server=cp1251
collation-server=cp1251_general_ci
init-connect="SET NAMES cp1251"
skip-character-set-client-handshake

последняя строка не сработала на MySQL версии 4.1.x, но в версии 5.х сервер нормально запустился. В четверке все работает и без последней строки, т.е. решение моих проблем в init-connect="SET NAMES cp1251".

Еще заместо этой строки в my.cnf помогает в PHP скрипте:

mysql_query('SET NAMES "cp1251"', $mysql_con);

Без этого все было вопросиками.

Теги: , , ,

Jan 20

Дело было так:

Звонит пользователь и жалуется что сортировка вывода данных из MySQL неправильная, т.е. не по алфавиту.

Полез в php скрипты и вытащил запрос который так криво работал,  примечательно что в order by стояло поле по которому нужно было сортировать по алфавиту, вобщем вытащил sql запрос и запустил его в утилите SQLyog. Запрос выдал данные но сортировка по указанному в order by  полю не была адекватной.

Полез в свойства таблицы все тем же SQLyog, командой alter_table, смотрю, а на Collation установлено latin1_swedish_ci - вот почему не по русски сортировка! Меняю ее на cp1251_general_ci, жму кнопочку Alter_Table, радуюсь что быстро отделался. Но …

Не тут то было данные в поле испортились, каждая русская буква превратилась в знак вопроса, замена свойства Collation положения не исправило.

#$%^&*

Итого, т.к. данных для восстановления не было пришлось восстанавливать данные руками - 2 дня 3 человека, хотя нет вру не 3 человека, остальные 4 человека работали от 3 часа - 8 часов.

Почему такое произошло, я имею ввиду конвертацию в вопросики непонятно, я делал это не один раз на разных серверах - ничего подобного не происходило.

ЗЫ. чето дневник у меня получается о глюках MySQL

Теги: ,

Dec 08

Проблема:

Есть два веб. ресурса: Один под Solaris_10, PHP_4, MySQL5. А второй WindowsXP, PHP5, MySQL4. Понадобилось мне из Windows обратиться в базу MySQL5 (которая на Solaris). Создал пользователя, чтобы обращаться с любого хоста, а не только в localhost, написал небольшой запрос и о чудо - все русские буквы распечатались знаками вопросов. $%^&* на соляре то все работает и уже давно (

Перерыл весь интернет в поисках рецепта, а там советуют делать правки в my.cnf прописать кодировку или в php скрипте сразу после конекта тоже обозначить кодировку cp1251. Ничего мне из этих советов не помогло.

А помогло вот что. На виндовс запустил из far-a стандартного консольного клиента mysql, но приконектился к серверу который на солярисе, сделал запрос, и что вижу … конечно кракозябры, но не вопросики, т.е. все в порядке!!! буквы windows-1251 кодировки в консоли выглядят кракозябрами. Пишу команду SET NAMES ‘cp1251′ как было написано на многочисленных сайтах найденных гуглом, делаю опять запрос, оппа, теперь вопросики заместо русских букв.

Решение:

Короче говоря в начале работы с mysql в скрипте php поставить след. строку

mysql_query(’SET NAMES “latin1″‘);

после этого все заработало, осталось только недоумение, почему latin1 правильно отображает русские буквы.

P.S. Вообще в mysql если посмотреть variables много переменных в которых храниться кодировка, конечно каждая переменная отвечает за что то свое, но видимо их многочисленность влияет на путаницу в этом вопросе.

Теги: , ,

Oct 17

 

Собственно ошибку обнаружил выполняя один проект.

Суть: При запросе из таблицы взято значение из поля float (это была цена), нужно было запросить из этой же таблицы все записи с такой же ценой.

Проблема: Ни одной записи по запросу MySQL не вернул. Что довольно таки странно т.к. должна быть хотя бы одна запись из которой эту цифру взяли.

Решение:
По запросу mysql float problem Гугл выдал первой в списке
http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
Где написано о данной проблеме, шо дескать зависит от архитектуры компьютера, т.е. процессор виноват

Потом указано как победить данный казус, т.е. применяя функцию round
и …
перед этим написано
Warning
Never use this method in your applications. It is not an example of a trustworthy method!

и как быть после таких заявлений.

Я конечно в запросе функцию применил, все заработало, но …
… осадок то остался.

Теги: , ,