Если у вас MySQL 4.x/5.x и ЛЮБЫЕ ПРОБЛЕМЫ С РУССКИМ - ЧИТАТЬ ЭТО!

Статус
В этой теме нельзя размещать новые ответы.

SibProgrammer

Новичок
Пару месяцев назад делал апгрейд с MySQL 4.0 до MySQL 4.1. Сервер хостинга, ОС - FreeBSD, БД - 130 штук.

По историческим причинам чарсетом по-умолчанию стоял koi8-r. Однако, большинство клиентов хранило данные в таблицах в win-1251 :( Около десятка БД действительно держали данные в koi8-r (а также еще в чем попало, например, в utf8).

Вообщем, после осмысливания все этого, понял, что переезд будет геморным и сделать всем хорошо - не получится. Заставить клиентов переписать все скрипты или даже просто сконверитировать все БД - просто нереально.

MySQL 4.1 был установлен и начались манипуляции с кодировками. После каждой манипуляции приходилось компилить php - что довольно сильно надоело :(

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

Оставлять latin1 было бессмыслено, т.к. нужно тогда было бы конвертить все БД, что абсолютно не хотелось. Нужно было бы писать тулзу для этого, т.к. руками отконверитировать потребовался бы месяц или более...

Ставить koi8-r - оказалось тоже маразмом, т.к. нужно было бы конверитить все БД, в которых данные в win-1251.

Поэтому был поставлен win-1251 и, своими силами и силами некоторых клиентов, отконверитированы БД, в которых данные были в других кодировках, так как их было относительно мало.

Еще один из неприятных косяков агрейда - появляение новых ключевых слов в MySQL 4.1. Из-за этого у некоторых клиентов перестали работать некоторые скрипты, в которых были выборки из таблиц с названиями колонок в виде новых ключевых слов :(
 

DIS

Guest
Автор оригинала: SibProgrammer

Еще один из неприятных косяков агрейда - появляение новых ключевых слов в MySQL 4.1. Из-за этого у некоторых клиентов перестали работать некоторые скрипты, в которых были выборки из таблиц с названиями колонок в виде новых ключевых слов :(
у меня постоянно названия колонок и таблиц попадались из ключевых слов, например название таблицы ALL с полем SET =)
никаких проблем не возникало.

всё переконвертирование было бессмысленным, т.к. в 4.1.1 можно хранить не то что базы в разных кодировках, но и таблички в одной базе могут иметь различные кодировки. и при этом всякие функции работы со строками будут работать правильно.
 

slach

Новичок
DIS ;) да правда чтоли ???

а как будет работать
LEFT ('тест',2)
если тест в utf-8 ?
проверял?
 

DIS

Guest
с ютф не проверял:)

но у меня была база с данными в koi8-r при кодировке сервера cp1251. не работали все эти функции или работали криво.
после изменения кодировки только для одной базы в koi8-r всё заработало.
 

SibProgrammer

Новичок
Автор оригинала: admin
SibProgrammer

Какие конкретно ключевые слова..
Конкретно на память приходит separator - это не было ключевым словом в MySQL 4.0.20

-~{}~ 01.06.05 10:23:

Автор оригинала: DIS
у меня постоянно названия колонок и таблиц попадались из ключевых слов, например название таблицы ALL с полем SET =)
никаких проблем не возникало.
Если скрипты нормально написаны, то ничего не глюкает, но у клиентов все гораздо кривее - из-за этого проблемы..

Автор оригинала: DIS
всё переконвертирование было бессмысленным, т.к. в 4.1.1 можно хранить не то что базы в разных кодировках, но и таблички в одной базе могут иметь различные кодировки. и при этом всякие функции работы со строками будут работать правильно.
Хм, надо внимательнее читать что написано выше! ;) Я в курсе того, что и как можно хранить в MySQL 4.1 ;)

Пример, БД - в которой данные находятся в кодировке koi8-r, а для полей таблицы стоит чарсет win-1251... И что клиент увидит в таком случае? Правильный ответ - кракозяблы! Как я уже говорил, при миграции бд, таблицы и колонки не получают чарсета, а используют чарсет по-умолчанию. Поэтому выставляя для сервера чарсет win-1251 я получаю у всех мигрировавших БД чарсет win-1251.
 

kvasvik

Guest
Re: Если у вас MySQL 4.1 и любые проблемы с русскими буквами, то загляните вначале сю

У меня если из скрипта сделать запрос SET NAMES - то кодировка исправляется, а на
АЛЬТЕРНАТИВНЫЙ ВАРИАНТ
# The MySQL server
[mysqld]
init-connect="SET NAMES cp1251"
- никакой реакции не наблюдается.

Где мускулу надо прописывать SET NAMES чтобы он его воспринимал и автоматически исполнял при каждом подключении?
 

alexhemp

Новичок
Я конечно сильно извиняюсь... но проблем не исиспытал...

ставил из портов FreeBSD

make WITH_CHARSET=cp1251 WITH_XCHARSET=all
make install

то-же и с клиентом, правда не уверен что ему эти опции нужны.

стоял до этого 4.0.20

Обновление прошло без каких-либо проблем, даже дампы не вливали. Подцепил все старые базы сам, пока проблем нет, но не знаю будут-ли. :)

Пересобрали все бинарники что работали с mysqlclient и все, phpinfo кажет версию клиента 4.1.12 ;-) Пароли даже не меняли, хотя я уже приготовился. Похоже формат пароля в базе кушает и старый и новый, главное чтобы клиент был свежий.

Немного не в тему - но рекомендую под FreeBSD добавить ключик WITH_LINUXTHREADS=yes

Работа сервера реально ускорилась в 2-3 раза. На многопроцессорных конфигурациях выигрыш будет еще больше...
 

Lord Daedra

Guest
Помогите плз: в БД что-то вроде ëâð ñ îâèûî, надо перевести в Windows-1251. Куда ту строчку надо вставить, что в начале этой темы?
вот так запрашивается информация:
if($act=="detail"){
$query = mysql_query("SELECT *, CONCAT(SUBSTRING(date,7,2), '-', SUBSTRING(date,5,2), '-', SUBSTRING(date,1,4)) AS datum FROM mos_orders WHERE id='$ido'");
$row = mysql_fetch_row($query);
nav();
?>
чуть ниже выводится так:
<? echo "$row[1]"; ?>
Я в php не очень, синтаксис запросов к БД тож не знаю... Плз, если не трудно, напишите рабочий вариант. я вставил в конец того запроса к БД, так он вообще перестал что-либо показывать в том месте...
 

kvasvik

Guest
Надо не в конец а отдельным запросом.

А если надо просто перекодировать строку можно использовать функцию convert_cyr_string
 

Lord Daedra

Guest
<? echo "$row[1]"; ?> и convert_cyr_string - как их объединить?
<? echo convert_cyr_string ("$row[1]"); ?>
<? echo "convert_cyr_string ($row[1])"; ?>
<? echo "convert_cyr_string ("$row[1]")"; ?>
я не кодер, подскажи, плз...
 

Lord Daedra

Guest
я поставил
<? echo convert_cyr_string("$row[1]", 'i','w'); ?>
что по-новому, что по-старому - разницы нет
мб я исходную кодировку не ту указал
&#235;&#226;&#240; &#241; &#238;&#226;&#232;&#251;&#238; - это в какой?
 

kvasvik

Guest
смотря что там было написано :)

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

Lord Daedra

Guest
абвгдеёжзийклмн
&#224;&#225;&#226;&#227;&#228;&#229;&#184;&#230;&#231;&#232;&eacut
 

kvasvik

Guest
похоже на iso, только латинскую а не кирилическую.

Тогда эта функция тебе не поможет.

Как тупой вариант, могу предложить вручную составить таблицу соответствия кодов символов и функцию которая с её помощью перекодует строку.

Или же надо смотреть какая у тебя выставлена кодировка у ячеек таблицы которые хранят эти данные и анализировать как они туда попали.
 

Lord Daedra

Guest
да мне какой угодно, лищь бы работало

можешь написать этот скрипт для 3 букв? буду очень признателен...и как его прикрутить вместо этого:
<? echo "$row[1]"; ?>
<? echo "$row[2]"; ?>...

я в пхп ничё почти не знаю, мне готовый вариант нужен.
я могу что-нить докодить, но только по аналогии...

-~{}~ 21.06.05 19:33:

&agrave;&aacute;&acirc;&atilde;&auml;&aring;&cedil;&aelig;&ccedil;&egrave;&eacut
а вот это так абвгд... в БД пишется

-~{}~ 21.06.05 19:35:

странно, не так хотел написать
& agrave;& aacute;& acirc;& atilde;& auml;& aring;& cedil;& aelig;& ccedil;& egrave;& eacut
пробелы убрать после амперсэнда
 

kvasvik

Guest
А у тебя в браузере по дефолту случайно не ISO-8859-1 выставлена?

Потому что я по кодам посмотрел - вроде всё совпадает.
 

alexhemp

Новичок
admin

Да извиняюсь, я имел ввиду ветку 4.x-STABLE... на production серверах я пока не тороплюсь обновлять до 5-STABLE. Но вроде в 5.4 щедулер починили ;-)

Конечно же в 5.x c therads лучше стало ;-) А в 6.x так вообще libc_r - "deprecated" будет...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху