Задолго до того, как я знал что-либо - не, что я знаю много даже сейчас - я разработал веб-приложение в php, который вставил данные в мою mysql базу данных после прокручивания значений htmlentities()
. Я в конечном счете пришел в себя и удалил этот шаг и засунул его в вывод, а не ввел и продолжил свой веселый путь.
Однако я должен был с тех пор пересмотреть некоторые из этих старых данных, и к сожалению у меня есть проблема, когда они отображены на экране, я получаю значения, отображенные, которые являются эффективно htmlentitied дважды.
Так, есть ли mysql или phpmyadmin способ возвратить все более старые, затронутые строки в их соответствующие символы, или я должен буду записать сценарий, чтобы считать каждую строку, декодировать и обновить все 17 миллионов строк в 12 таблицах?
Править:
Спасибо за справку все я записал свой собственный ответ ниже с некоторым кодом в, это не симпатично, но это работало над данными тестирования, ранее настолько запрещающими кого-то указывающего на явную ошибку в моем коде, в то время как я нахожусь в постели, я буду выполнять его на резервном DB завтра и затем на живом, если это удастся хорошо.
В итоге я использовал это, не очень красиво, но я устал, сейчас 2 часа ночи, и это сделало свое дело! (Edit: on test data)
$tables = array('users', 'users_more', 'users_extra', 'forum_posts', 'posts_edits', 'forum_threads', 'orders', 'product_comments', 'products', 'favourites', 'blocked', 'notes');
foreach($tables as $table)
{
$sql = "SELECT * FROM {$table} WHERE data_date_ts < '{$encode_cutoff}'";
$rows = $database->query($sql);
while($row = mysql_fetch_assoc($rows))
{
$new = array();
foreach($row as $key => $data)
{
$new[$key] = $database->escape_value(html_entity_decode($data, ENT_QUOTES, 'UTF-8'));
}
array_shift($new);
$new_string = "";
$i = 0;
foreach($new as $new_key => $new_data)
{
if($i > 0) { $new_string.= ", "; }
$new_string.= $new_key . "='" . $new_data . "'";
$i++;
}
$sql = "UPDATE {$table} SET " . $new_string . " WHERE id='" . $row['id'] . "'";
$database->query($sql);
// plus some code to check that all out
}
}
Поскольку PHP был методом кодирования, вы захотите использовать его для декодирования. Вы можете использовать html_entity_decode , чтобы преобразовать их обратно в исходные символы. Нужна петля!
Только будьте осторожны, чтобы не декодировать строки, которым это не нужно. Не знаю, как вы это определите.
Это немного неуклюже, но я думаю, что массовое обновление - единственный выход...
$Query = "SELECT row_id, html_entitied_column FROM table";
$result = mysql_query($Query, $connection);
while($row = mysql_fetch_array($result)){
$updatedValue = html_entity_decode($row['html_entitied_column']);
$Query = "UPDATE table SET html_entitied_column = '" . $updatedValue . "' ";
$Query .= "WHERE row_id = " . $row['row_id'];
mysql_query($Query, $connection);
}
Это упрощенный вариант, без обработки ошибок и т.д. Не уверен, каково будет время обработки миллионов строк, поэтому вам, возможно, придется разбить его на части, чтобы избежать таймаутов скрипта.
Я думаю, что написание php-скрипта - хорошее дело в этой ситуации. Как сказал Дейв, вы можете использовать функцию html_entity_decode () для обратного преобразования ваших текстов.
Сначала попробуйте свой сценарий на столе с несколькими записями. Это сэкономит вам много времени на тестирование. Конечно, не забудьте сделать резервную копию ваших таблиц перед запуском php-скрипта.
Боюсь, более короткой возможности нет. Вычисление миллионов строк остается довольно дорогостоящим, независимо от того, как вы конвертируете наборы данных обратно. Так что возьмите php-скрипт ... это самый простой способ