从数据库中删除html实体

dte*_*ech 5 sql html-entities

由于我的前任错误(MySQL)数据库我想使用包含很多HTML实体(例如,€而不是).

由于数据库应该包含原始数据(数据库不应该与HTML有任何关系)我想从数据库中删除它们并将其存储在正确的UTF8中,因此配置就是这样.

什么是解决这个问题的好方法?我唯一能想到的是编写一个获取所有数据的PHP脚本,通过html_entity_decode()运行它并将其写回.它是可行的,因为它是一次性操作,而DB只有大约100MB,但它仍然不是最佳的.

有任何想法吗?

dte*_*ech 2

由于没有人能够提供令人满意的纯 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();
}
?>
Run Code Online (Sandbox Code Playgroud)