после апгрейда 1.6.1 на 2.3.1 вместо текста вопросительные знаки + обрезан длинный текст |
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
1. при апгрейде через admin.php была выбрана utf8 (нажала на ссылку), вроде же база у меня была в utf8, т.к. я раньше еще исправляла всё в 2008 году после апгрейда на 1.6.1.
Комментарии и заголовки почти не пострадали (иногда вопросительные знаки, а в кратком содержании вместо троеточия какой-то крякозябр, что видно на фото) , сами записи пострадали в большинстве своем, но иногда заголовок испортился, а запись нет. В некоторых записях поле body вообще пустое, осталось только предисловие статьи.
Имеется копия базы данных, которую я качала через специальную утилиту (если кому интересно) SypexDumper 209. Может какие-то поля восстановить?
Запись блокнота тоже стала с вопросительными знаками.
2. Помогите, пожалуйста. В продолжение темы. У меня длинный текст обрезался. Да, у меня есть страницы с очень большим наполнением.У меня в базе данных специально для этого был параметр MEDIUMTEXT для field_id_2 (это в записях поле body). А после апгрейда стало в таблице exp_channel_data (которая раньше была exp_weblog_data) поле field_id_2 формат TEXT, а это максимум 64Кб. Как при апгрейде не менять параметр MEDIUMTEXT на TEXT?
TEXT - 65535 символов, MEDIUMTEXT (до 16777215 символов), LONGTEXT (до 4294967295 символов)
Приложения с изображениями
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Отвечу себе сама. Может еще кому-то поможет. Во время апгрейда версии обновляются по нарастающей 1.6.4, 1.6.6… 2.0.0…. 2.3.1. Конвертация базы данных происходит на этапе апгрейда на версию 2.0.0. А мне конвертация не нужна, т.к. таблицы уже в utf8
В папке \system\installer\updates ищем файл ud_200.php
Меняем latin1 на utf8, latin1_swedish_ci на utf8_general_ci.
Но в очень длинных страницах текст обрезался! Я длину полей устанавливала в базе данных когда-то, всё спокойно умещалось. Сейчас если текст добавить, то тоже вместится.
Осталась какая-то хрень в комментариях, если следующая буква —СОГЛАСНАЯ. Если гласная, то просто троеточие пишется, как и положено. Причем если открыть полный текст комментария, с буквами проблем нет.
Приложения с изображениями
Нажмите на изображение для его просмотра в реальном масштабе
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Помогите, пожалуйста. В продолжение темы. У меня длинный текст обрезался. Да, у меня есть страницы с очень большим наполнением.У меня в базе данных был параметр MEDIUMTEXT для field_id_2 (это в записях поле body). А после апгрейда стало в таблице exp_channel_data (которая раньше была weblog_data) поле field_id_2 формат TEXT, а это максимум 64Кб. Как при апгрейде не менять параметр MEDIUMTEXT на TEXT?
TINYTEXT эквивалентен VARCHAR(255) ???
TINYTEXT — 256 байт (2 в восьмой степени)
TEXT— 64 Кб = 64*1024байт = 65536 байт
MEDIUMTEXT — 16 Мб = 16*1024*1024 байта 16777216 байт
LONGTEXT — 4 Гб = 4*1024*1024*1024 байта = 4294967296 байт
Подробнее http://dev.mysql.com/doc/refman/4.1/en/storage-requirements.html
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Я в php не разбираюсь, но похоже где-то в строке 1277 и ниже в файле ud_200.php
if ($query->num_rows() > 0) { foreach ($query->result() as $row) { if ($row->field_type == 'date' OR $row->field_type == 'rel') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` int(10) NOT NULL DEFAULT 0"; if ($row->field_type == 'date') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_dt_{$row->field_id}` `field_dt_{$row->field_id}` varchar(8) NULL"; } } else { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` text NULL"; } }
Вот тут последняя строка text NULL, вот наверно тут MEDIUMTEXT меняется на TEXT. Или поставить MEDIUMTEXT, а потом уже руками на TEXT поменять там, где не нужен большой объем текста. Либо вставить условие, что если MEDIUMTEXT, то ничего не менять. Как?
|
|
|
|
|
|
Администратор
Всего сообщений: 891
Зарегистрирован 2008-01-07
|
bestann - 25 Январь 2012 05:23 P.M. Либо вставить условие, что если MEDIUMTEXT, то ничего не менять. Как?
попробуйте выставить условие с нужным полем
if ($row->field_id == ‘2’)
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
по идее условие if ($row->field_type == ‘mediumtext’) тоже должно сработать?
|
|
|
|
|
|
Администратор
Всего сообщений: 891
Зарегистрирован 2008-01-07
|
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
// Update custom fields to allow null $query = $this->EE->db->query("SELECT field_id, field_type FROM exp_weblog_fields");
if ($query->num_rows() > 0) { foreach ($query->result() as $row) { if ($row->field_type == 'date' OR $row->field_type == 'rel') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` int(10) NOT NULL DEFAULT 0";
if ($row->field_type == 'date') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_dt_{$row->field_id}` `field_dt_{$row->field_id}` varchar(8) NULL"; if ($row->field_id == '2') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` mediumtext NULL"; } } } else { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` text NULL"; } } }
$this->_run_queries('Updating custom fields', $Q);
return 'resync_member_groups';
Не получилось по-люботму. Сравнивать mediumtext как я хотела вроде нельзя, потому что для сравнения берутся данные из таблицы exp_weblog_fields (в прошлый ряз я в скрине кода эту первую строку не включила в скрин), а там поля другие. field_id те же, а field_type совсем о другом говорят (для нашего случая видим, что тут тип textarea), что видно по первому сриншоту. На втором и третьем сриншотах видно, что было и что стало. Всё равно заменилось на text. Где-то еще в коде надо копать, или я неправильно сделала подстановку условия. Надо наверно искать место в коде, где varchar(40) заменяется на tinytext. В этом файле tinytext нигде не упоминался. В up_165.php что-то есть, но не видно замены на text.
foreach ($query->result_array() as $row) { if (strncmp($row['Field'], 'field_ft', 8) == 0) { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `{$row['Field']}` `{$row['Field']}` TINYTEXT NULL"; } }
Приложения с изображениями
|
|
|
|
|
|
Администратор
Всего сообщений: 891
Зарегистрирован 2008-01-07
|
попробуйте так
if ($query->num_rows() > 0) { foreach ($query->result() as $row) { if ($row->field_type == 'date' OR $row->field_type == 'rel') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` int(10) NOT NULL DEFAULT 0"; if ($row->field_type == 'date') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_dt_{$row->field_id}` `field_dt_{$row->field_id}` varchar(8) NULL"; } } else { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` text NULL";
if ($row->field_type == 'mediumtext') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` mediumtext NULL"; } } }
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Смущает выборка из таблицы
"SELECT field_id, field_type FROM exp_weblog_fields.
А в exp_weblog_fields нет никакого mediatext. Т.е. field_type в exp_weblog_fields (описывает тип поля ввода varchar(50)) и в exp_weblog_data (описывает тип вводимых данных mediumtext) — разные значения, а вот field_id и там и там совпадает.
Получается, что есть ограничение по количеству вложенных условий if? Буду дома — попробую ваш вариант вложения условия. Сначала с mediumtext (но мне кажется, не сработает), потом с field_id=2.
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Так сработало правильно, но всё равно текст обрезан, хотя тип mediumtext. Видимо, поле mediumtext преобразуется в text еще ДО файла up_200.php, т.е. до апгрейда на 2 версию. Периодически при апгрейде появлялось “502 Bad Gateway”, но так было начиная с попыток апгрейда на прошлой неделе.
На сайте ЕЕ есть аналогичные жалобы на обрезание текста, но как исправить? http://expressionengine.com/forums/viewthread/197255/ так и не ответили. Занесли в баги http://expressionengine.com/bug_tracker/bug/16922
Может хотя бы как-то можно из старой таблицы скопировать все поля field_id_2 ?
Или в условии поменять порядок? Может сначала выполняется та строка, где в text переводится, а потом уже field_id_2 становится mediumtext?
$query = $this->EE->db->query("SELECT field_id, field_type FROM exp_weblog_fields");
if ($query->num_rows() > 0) { foreach ($query->result() as $row) { if ($row->field_type == 'date' OR $row->field_type == 'rel') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` int(10) NOT NULL DEFAULT 0";
if ($row->field_type == 'date') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_dt_{$row->field_id}` `field_dt_{$row->field_id}` varchar(8) NULL"; } } else { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` text NULL"; if ($row->field_id == '2') { $Q[] = "ALTER TABLE `exp_weblog_data` CHANGE `field_id_{$row->field_id}` `field_id_{$row->field_id}` mediumtext NULL"; } } } }
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
может хотя бы кто-нибудь подскажет, как из старой базы из таблицы exp_weblog_data скопировать с полной заменой в новую базу в таблицу exp_channel_data, все данные в столбце field_id_2. Чтоб восстановить обрезанный текст.
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Интересное наблюдение. Текст обрезается не совсем точно до размера text, а странным образом: text 64Кб, а осталось где-то 56Кб.
|
|
|
|
|
|
Администратор
Всего сообщений: 891
Зарегистрирован 2008-01-07
|
bestann - 31 Январь 2012 06:10 P.M. может хотя бы кто-нибудь подскажет, как из старой базы из таблицы exp_weblog_data скопировать с полной заменой в новую базу в таблицу exp_channel_data, все данные в столбце field_id_2. Чтоб восстановить обрезанный текст.
может через Navicat?
|
|
|
|
|
|
Member
Всего сообщений: 158
Зарегистрирован 2008-01-21
|
Поставила её, не подходит hostname…. не знаю как соединиться. если непосредственно на серваке, то просто было в конфиге localhost.
Подскажите, у вас в exp_channel_data почти все поля по умолчанию NULL? Мне кажется, что не все скрипты апгрейда прошли... Была постоянно запинка во время апгрейда, я обновляла страницу и потом продолжала апгрейд.
|
|
|
|
|
|
Администратор
Всего сообщений: 891
Зарегистрирован 2008-01-07
|
bestann - 12 Февраль 2012 09:29 P.M. Поставила её, не подходит hostname…. не знаю как соединиться. если непосредственно на серваке, то просто было в конфиге localhost.
если виртуальный хостинг, то например через http tunnel (в папке куда установлена программа есть ntunnel_mysql.php)
можно локально установить вебсервер - Open Server, Denwer, Wamp, Xamp
|
|
|
|