Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Обсуждение общих технических вопросов > FAQ (Часто задаваемые вопросы)

Ответ
 
Опции темы Опции просмотра
Старый 28.06.2006, 07:33   #1
Дылгеров Ц.В.
Senior Member
 
Регистрация: 14.11.2005
Адрес: Улан-Удэ
Сообщений: 158
Отправить сообщение для Дылгеров Ц.В. с помощью ICQ
По умолчанию

Переношу БД в utf-8.
БД конвертируется хорошо. Так как default character set установлен в UTF-8, то при импорте дампа таблицы создаются с charset utf-8 и collation utf_general_ci. Сам дамп конвертирую такой программой

Цитата:
<?php

$handle = fopen("olddump.sql","r");
$newhandle = fopen("olddump.sql.utf-8","w");
$contents = '';
while (!feof($handle)) {
$contents = fread($handle, 8192);
$contents = iconv("WINDOWS-1251","UTF-8",$contents);
// $contents = convert_cyr_string(); - здесь кажется нет utf-8
// $contents = mb_convert_encoding($contents,"UTF-8","WINDOWS-1251");
fwrite($newhandle,$contents);
}
fclose($handle);
fclose($newhandle);

?>
Проблема такая - в таблице pages поле title имеет тип tinytext, то есть 256 символов. При конвертации если текст в поле title превышает некоторое значение (так и непонял какое - 128??) - выходит ошибка:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -p -u root mynewdbinutf8 < olddump.sql.utf-8
Enter password: ****************************************
ERROR 1406 (22001) at line 1: Data too long for column 'title' at row 1

вызвано это тем что при конвертации из windows-1251 в utf-8 title длиной 163 превратился в 307 - а это уже больше чем tinytext

Что посоветуете? Или я что то неправильно делал?

Может в команде mysql -p -u root mynewdbinutf8 < olddump.sql.utf-8 добавить default-charset=windows-1251 и не конвертировать дамп?

Последний раз редактировалось Дылгеров Ц.В.; 05.09.2006 в 05:29
Дылгеров Ц.В. вне форума   Ответить с цитированием
Старый 28.06.2006, 11:40   #2
Valery Romanchev
Administrator
 
Аватар для Valery Romanchev
 
Регистрация: 23.08.2003
Адрес: Moscow, Russia
Сообщений: 1,926
Отправить сообщение для Valery Romanchev с помощью Skype™
По умолчанию

я конвертировал из windows-1251 в uft8 с помощью экстеншена. Их там 2, использовал тот, который Андрей Шварцкопф делал.
__________________
Веб-студия ТТЛАБ
www.ttlab.ru
Valery Romanchev вне форума   Ответить с цитированием
Старый 28.06.2006, 11:43   #3
Valery Romanchev
Administrator
 
Аватар для Valery Romanchev
 
Регистрация: 23.08.2003
Адрес: Moscow, Russia
Сообщений: 1,926
Отправить сообщение для Valery Romanchev с помощью Skype™
По умолчанию

Цитата:
В BE - будет один и тот же charset
(в базу все будет идти в utf8, юзер у которого руссий язык - будет в BE работать в windows 1251 - с этим подробно разбирался Павел Антонов - он вроде даже патч делал на эту тему... чтобы все-таки все было в utf8)
А для вывода в FE - для разных деревьев можно проставить разные кодировки - на лету идет конвертация
Вот только если для FE стоит windows-1251, то index search записывает кракозябры (т.е. в index search ошибка). И возможно это не единственная проблема... Так что используйте utf8
__________________
Веб-студия ТТЛАБ
www.ttlab.ru
Valery Romanchev вне форума   Ответить с цитированием
Старый 13.07.2006, 07:08   #4
Дылгеров Ц.В.
Senior Member
 
Регистрация: 14.11.2005
Адрес: Улан-Удэ
Сообщений: 158
Отправить сообщение для Дылгеров Ц.В. с помощью ICQ
По умолчанию Кое что нарыл по Typo3 3.8 и по конвертации cp1251->utf8

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

mysql должен 4.1 и выше - старые версии mysql utf хранят иначе, точно не могу объяснить как, но в новых версиях мускла поиск будет работать правильно.

Дамп из latin1 (те есть со старого сайта на cp-1251) должен быть читабельным в виндовой кодировке.
Затем применяем команду iconv или можно применить php-скрипт указанный выше. Проверяем в hex-виде - в русских символах первый байт чаще всего D0. Значит это UTF-8. Для окончательного успокоения открываем файл в Ultra-Edit. Или меняя кодировку в клиенте ssh смотрим дамп командой cat VASH_DAMP | more.

Сервер уже должен быть в кодировке UTF8 - в my.cnf
[mysqld]
default_character_set = utf8

Импорт надо делать, предварительно меняя character set client = utf8. Как это делается?
Можно внедрить в начало полученного конвертированием дампа строку: "SET NAMES utf8;", а проще войти в каталог где лежит дамп и:
mysql -p -u rooot
set names utf8;
use VASHA_BASA;
source VASH_DUMP;
Зачем нужна команда set names utf8. Наверное тут говорилось, но я повторюсь - чтобы клиент mysql говорил серверу mysql что данные в кодировке utf8. По умолчанию у клиента стоит latin1. То есть если не поменять кодировку, то сервер будет думать что все данные в latin1 и русские слова будут заново конвертироваться и будут вдвое большего размера и выглядеть крако-кракозябрами.

(кстати вот тут я подумал - может тогда не конвертировать дамп - а предоставить эту возможность mysql? то есть не конвертировать дамп и обновременно не делать команду set names utf8?)

В Typo3 3.8 в /t3lib/class.t3lib_db.php в функции sql_pconnect нет куска кода ответственного за выполнение команд в переменной $GLOBALS['TYPO3_CONF_VARS']['SYS']['setDBinit']). Вот этот код из Typo3 4.0:
Цитата:
if (!$this->link) {
t3lib_div::sysLog('Could not connect to Mysql server '.$TYPO3_db_host.' with user '.$TYPO3_db_username.'.','Core',4);
} else {
$setDBinit = t3lib_div::trimExplode(chr(10), $GLOBALS['TYPO3_CONF_VARS']['SYS']['setDBinit']);
foreach ($setDBinit as $v) {
if (mysql_query($v, $this->link) === FALSE) {
t3lib_div::sysLog('Could not initialize DB connection with query "'.$v.'".','Core',3);
}
}
}
Если у вас Typo3 3.8 - ставьте этот код иначе все что сказано в этом треде не будет работать.

я же применил другой хак, взятый здесь http://bugs.typo3.org/view.php?id=1262 (спасибо за ссылку Валерию):

if ($TYPO3_CONF_VARS["BE"]["forceCharset"]=='utf-8') {
mysql_query("SET NAMES utf8",$this->link);
mysql_query("SET CHARACTER_SET utf8",$this->link);
}

, но условие не срабатывало, а сработало

if ($GLOBALS['TYPO3_CONF_VARS']["BE"]["forceCharset"]=='utf-8') {
mysql_query("SET NAMES utf8",$this->link);
mysql_query("SET CHARACTER SET utf8",$this->link);
} - сами понимаете почему.

Последний раз редактировалось Дылгеров Ц.В.; 13.07.2006 в 07:36
Дылгеров Ц.В. вне форума   Ответить с цитированием
Старый 13.07.2006, 17:36   #5
Guinness
Новенький
 
Регистрация: 23.03.2006
Сообщений: 20
По умолчанию

а если это свежая установка "с нуля", где дампа нет, то что делать?
Guinness вне форума   Ответить с цитированием
Старый 14.07.2006, 05:00   #6
Дылгеров Ц.В.
Senior Member
 
Регистрация: 14.11.2005
Адрес: Улан-Удэ
Сообщений: 158
Отправить сообщение для Дылгеров Ц.В. с помощью ICQ
По умолчанию

Цитата:
Сообщение от Guinness
а если это свежая установка "с нуля", где дампа нет, то что делать?
да забыл - хорошая сцылка http://wiki.typo3.org/index.php/UFT-8_support
Дылгеров Ц.В. вне форума   Ответить с цитированием
Старый 19.08.2006, 16:14   #7
Batonoff
Новенький
 
Регистрация: 01.08.2006
Сообщений: 3
По умолчанию

<?php

$handle = fopen("olddump.sql","r");
$newhandle = fopen("olddump.sql.utf-8","w");
$contents = '';
while (!feof($handle)) {
$contents .= fread($handle, 8192);
$contents = iconv("WINDOWS-1251","UTF-8",$contents);
// $contents = convert_cyr_string(); - здесь кажется нет utf-8
// $contents = mb_convert_encoding($contents,"UTF-8","WINDOWS-1251");
fwrite($newhandle,$contents);
}
fclose($handle);
fclose($newhandle);

?>

Есть дамп базы в кодировке cp1251. После конвертации скриптом указанным выше, получается файл неприлично большого размера. Из 10 мегабайт получается более 300, дальше мой апач вешается...

Вопрос: размер должен стать таким, это особенность ютф8 или что это?
Batonoff вне форума   Ответить с цитированием
Старый 21.08.2006, 04:54   #8
jax
Продвинутый
 
Аватар для jax
 
Регистрация: 28.02.2006
Сообщений: 61
Отправить сообщение для jax с помощью ICQ Отправить сообщение для jax с помощью Skype™
По умолчанию

Если я не ошибаюсь, то вас ошбка в коде:
Код:
$contents .= fread($handle, 8192);
а логичнее:
Код:
$contents = fread($handle, 8192);
Т.е. на очередном шаге цикла вы взятые из файла 8 кБайт добавляете к значение хранящемуся в $contents, а затем пишиете все это в выходной файл.

А в общем, даже если предположить, что в дампе все символы из кириллицы (кодируемые в utf8 по 2 байта на символ) то файл не должен быть польше 20 мег. А ввиду того, что в дампе, как правило, достаточно много символов из latin1 (кодируемых 1-м байтом) то размер должен быть мег 16-18 при начальных 10.
jax вне форума   Ответить с цитированием
Старый 15.09.2006, 04:18   #9
filippoff
Senior Member
 
Аватар для filippoff
 
Регистрация: 22.01.2006
Адрес: Санкт-Петербург
Сообщений: 285
Отправить сообщение для filippoff с помощью ICQ Отправить сообщение для filippoff с помощью Skype™
По умолчанию

применительно к indexed search: должен ли в utf-8 при условии правильной настройки работать морфологический поиск?
у меня, к примеру, только прямые совпадения ищет..
filippoff вне форума   Ответить с цитированием
Старый 15.09.2006, 12:58   #10
Valery Romanchev
Administrator
 
Аватар для Valery Romanchev
 
Регистрация: 23.08.2003
Адрес: Moscow, Russia
Сообщений: 1,926
Отправить сообщение для Valery Romanchev с помощью Skype™
По умолчанию

Цитата:
Сообщение от filippoff
применительно к indexed search: должен ли в utf-8 при условии правильной настройки работать морфологический поиск?
у меня, к примеру, только прямые совпадения ищет..
поиска по словоформам для русского языка в TYPO3 нет.
Насколько сложно его сделать - я не копал, наверное сложно.
Впрочем, никто из серьезных заказчиков (я имею ввиду ITспециалистов из 2х крупных контор, которые занимаются системной интерацией и входят в top10 в России) на этом не настаивал... все понимают, что поиск на сайте - это не яндекс.

Варианты типа MnogoSearch сложны в настройке и обслуживании (если только MnogoSearch уже не стоит у данного провайдера).
Да и выигрыш от их использования будет не большой... люди как правило ишут простые слова, фамилии.. т.е. слоформы не так уж важны.
__________________
Веб-студия ТТЛАБ
www.ttlab.ru

Последний раз редактировалось Valery Romanchev; 15.09.2006 в 13:03
Valery Romanchev вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 22:24.


Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot

Хостинг и техническая поддержка: TYPO3 Лаборатория