Удалить html-объекты из базы данных - PullRequest
5 голосов
/ 25 ноября 2011

Из-за ошибок моих предшественников (MySQL) база данных, которую я хотел бы использовать, содержит много сущностей HTML (например, € вместо ).

Поскольку база данных должна содержать необработанные данные (база данных не должна иметь ничего общего с HTML), я хочу удалить их из БД и сохранить их в надлежащем UTF8, словосочетание уже такое.

Что было бы хорошим способом исправить это? Единственное, о чем я могу думать, - это написать скрипт PHP, который получает все данные, запускает их через html_entity_decode () и записывает обратно. Это выполнимо, так как это однократная операция, и размер БД составляет всего около 100 МБ, но это все равно меньше оптимального значения.

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 11 апреля 2012

Поскольку никто не мог предоставить удовлетворительное решение только для SQL, я решил его с помощью скрипта, похожего на этот.Обратите внимание, что это работает только в том случае, если все таблицы, в которых вы используете его, имеют первичный ключ, но обычно это имеет место

<?php
// Specify which columns need to be de-entitiezed
$affected = array(
    'table1' => array('column1', 'column2'),
    'table2' => array('column1', 'column2'),
);

// Make database connection
$db = new PDO("mysql:dbname=yourdb;host=yourhost", "user", "pass");

foreach($affected as $table => $columns){
    // Start a transaction for each table
    $db->beginTransaction();

    // Find the table primary key. PHP5.4 syntax!
    $pk = $db->query("SHOW INDEX FROM " . $table . " WHERE Key_name = 'PRIMARY'")->fetch()[0];

    foreach($columns as $column){
        // Construct a prepared statement for this column
        $ps = $db->prepare("UPDATE " . $table . " SET " . $column . " . = ? WHERE " . $pk . " = ?");

        // Go through all rows
        foreach( $db->query("SELECT " . $column . ", " . $pk . " FROM " . $table) as $row){
            $row[0] = html_entity_decode($row[0]);  // Actual processing
            $ps->execute($row);
        }
    }

    // Everything went well for this table, commit
    $db->commit();
}
?>
1 голос
/ 25 ноября 2011

Мне нужно создать процедуру mysql. (с циклом SELECT и заменой обновления)
REPLACE(TextString, '&apos;','"') ;

0 голосов
/ 25 ноября 2011

В конечном счете, я думаю, что на каком-то этапе вам придется прибегнуть к PHP, преобразование множества этих объектов в SQL приведет к огромному количеству логики принятия решения.

Однако один подход я могуПодумайте, нужно ли вам использовать SQL, это создать пользовательскую функцию, которая по существу имеет огромный оператор case в (или множество if / then's):

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

Тогда вы просто сможете сделатьчто-то вроде:

SELECT col1,col2,col3,mtuserdecodefunction(column-with-entities-in) FROM mytable

Что теоретически должно вернуть вам очищенную таблицу.

0 голосов
/ 25 ноября 2011

В зависимости от базы данных (Oracle, MySql и т. Д.) И от того, можете ли вы отключить ее от сети, вы можете экспортировать весь DDL и данные в виде большого сценария SQL (содержащего INSERT для всех таблиц).Затем вы можете выполнить стандартный поиск / замену, используя sed:

sed -i 's/&euro;/€/g' script.sql

, затем удалить базу данных или обрезать таблицы и воссоздать ее с помощью сценария.

...