Искать  
 
   
1 из 2
1
после апгрейда 1.6.1 на 2.3.1 вместо текста вопросительные знаки + обрезан длинный текст
Отправлено: 21 Январь 2012 05:31 P.M.   [ Игнорировать ]
Member
RankRankRank
Всего сообщений:  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 символов)

Приложения с изображениями
2012-01-21_182443.png2012-01-21_183509.png2012-01-21_183846.png2012-01-21_184828.png
Профиль
 
 
Отправлено: 23 Январь 2012 09:02 P.M.   [ Игнорировать ]   [ # 1 ]
Member
RankRankRank
Всего сообщений:  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.

Но в очень длинных страницах текст обрезался! Я длину полей устанавливала в базе данных когда-то, всё спокойно умещалось. Сейчас если текст добавить, то тоже вместится.

Осталась какая-то хрень в комментариях, если следующая буква —СОГЛАСНАЯ. Если гласная, то просто троеточие пишется, как и положено. Причем если открыть полный текст комментария, с буквами проблем нет.

Приложения с изображениями
2012-01-23_221859.png
Профиль
 
 
Отправлено: 24 Январь 2012 09:24 P.M.   [ Игнорировать ]   [ # 2 ]
Member
RankRankRank
Всего сообщений:  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

Профиль
 
 
Отправлено: 25 Январь 2012 05:23 P.M.   [ Игнорировать ]   [ # 3 ]
Member
RankRankRank
Всего сообщений:  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, то ничего не менять. Как?

Профиль
 
 
Отправлено: 26 Январь 2012 03:35 P.M.   [ Игнорировать ]   [ # 4 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07
bestann - 25 Январь 2012 05:23 P.M.

Либо вставить условие, что если MEDIUMTEXT, то ничего не менять. Как?

попробуйте выставить условие с нужным полем

if ($row->field_id == ‘2’)

Профиль
 
 
Отправлено: 26 Январь 2012 05:30 P.M.   [ Игнорировать ]   [ # 5 ]
Member
RankRankRank
Всего сообщений:  158
Зарегистрирован  2008-01-21

по идее условие if ($row->field_type == ‘mediumtext’) тоже должно сработать?

Профиль
 
 
Отправлено: 26 Январь 2012 06:36 P.M.   [ Игнорировать ]   [ # 6 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07

по идее можно и так)

Профиль
 
 
Отправлено: 29 Январь 2012 11:28 P.M.   [ Игнорировать ]   [ # 7 ]
Member
RankRankRank
Всего сообщений:  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";
            
}
        } 
Приложения с изображениями
exp_weblog_fields-field-id-2.pngexp_weblog_data.pngexp_channel_data.png
Профиль
 
 
Отправлено: 30 Январь 2012 12:02 A.M.   [ Игнорировать ]   [ # 8 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  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";
                    
}                     
                }
            } 
Профиль
 
 
Отправлено: 30 Январь 2012 11:17 A.M.   [ Игнорировать ]   [ # 9 ]
Member
RankRankRank
Всего сообщений:  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.

Профиль
 
 
Отправлено: 30 Январь 2012 10:06 P.M.   [ Игнорировать ]   [ # 10 ]
Member
RankRankRank
Всего сообщений:  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";
                    
}       
                }
            }
        } 
Профиль
 
 
Отправлено: 31 Январь 2012 06:10 P.M.   [ Игнорировать ]   [ # 11 ]
Member
RankRankRank
Всего сообщений:  158
Зарегистрирован  2008-01-21

может хотя бы кто-нибудь подскажет, как из старой базы из таблицы exp_weblog_data скопировать с полной заменой в новую базу в таблицу exp_channel_data, все данные в столбце field_id_2. Чтоб восстановить обрезанный текст.

Профиль
 
 
Отправлено: 02 Февраль 2012 09:10 P.M.   [ Игнорировать ]   [ # 12 ]
Member
RankRankRank
Всего сообщений:  158
Зарегистрирован  2008-01-21

Интересное наблюдение. Текст обрезается не совсем точно до размера text, а странным образом: text 64Кб, а осталось где-то 56Кб.

Профиль
 
 
Отправлено: 08 Февраль 2012 03:23 P.M.   [ Игнорировать ]   [ # 13 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07
bestann - 31 Январь 2012 06:10 P.M.

может хотя бы кто-нибудь подскажет, как из старой базы из таблицы exp_weblog_data скопировать с полной заменой в новую базу в таблицу exp_channel_data, все данные в столбце field_id_2. Чтоб восстановить обрезанный текст.

может через Navicat?

Профиль
 
 
Отправлено: 12 Февраль 2012 09:29 P.M.   [ Игнорировать ]   [ # 14 ]
Member
RankRankRank
Всего сообщений:  158
Зарегистрирован  2008-01-21

Поставила её, не подходит hostname…. не знаю как соединиться. если непосредственно на серваке, то просто было в конфиге localhost.

Подскажите, у вас в exp_channel_data почти все поля по умолчанию NULL? Мне кажется, что не все скрипты апгрейда прошли... Была постоянно запинка во время апгрейда, я обновляла страницу и потом продолжала апгрейд.

Профиль
 
 
Отправлено: 13 Февраль 2012 05:15 P.M.   [ Игнорировать ]   [ # 15 ]
Администратор
Avatar
RankRankRankRank
Всего сообщений:  891
Зарегистрирован  2008-01-07
bestann - 12 Февраль 2012 09:29 P.M.

Поставила её, не подходит hostname…. не знаю как соединиться. если непосредственно на серваке, то просто было в конфиге localhost.

если виртуальный хостинг, то например через http tunnel (в папке куда установлена программа есть ntunnel_mysql.php)

можно локально установить вебсервер - Open Server, Denwer, Wamp, Xamp

Профиль
 
 
   
1 из 2
1