2011-11-25 82 views
5

由于我的前任错误,我想使用的一个(MySQL)数据库包含很多HTML实体(例如€而不是)。从数据库中删除html实体

随着数据库应该包含原始数据(数据库不应该有任何与HTML做的),我想从数据库中删除,并将其存储在适当的UTF8,搭配已经是这一点。

什么是解决这一问题的好办法?我唯一能想到的是编写一个PHP脚本来获取所有数据,通过html_entity_decode()运行并写回。这是可行的,因为它是一次性操作,数据库只有大约100MB,但仍不够理想。

任何想法?

+0

工作,你也许可以做简单的字符串更新查询查找/替换。但是,如果种类繁多,那么请使用PHP往返选项。 –

+0

有超过50个实体在使用这个数据库孤独,HTML允许每个字符写为使用&#xxx;语法HTML实体,所以它不是为搜索和替换一样简单。 – dtech

回答

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(); 
} 
?> 
0

根据数据库(Oracle,MySql等)以及是否可以将其脱机,您可能可以将所有DDL和数据导出为大型SQL脚本(包含所有表的INSERT)。然后,你可以做一个标准的查找/替换使用sed

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

然后删除数据库或截断表,使用该脚本重新创建它。

0

最后,我想你将不得不诉诸PHP在某个阶段,将很多SQL这些entites的是要invole巨大desicion逻辑数量。

然而,一种方法我能想到的,如果你必须使用SQL,就是创建一个用户定义的函数,即esentially有一个巨大的case语句(或者很多的if/then是):

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

那么你应该简单地能够做到这样的事情:

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

这应该在理论上返回给你一个清理过的表。

1

我tnink u需要创建一个mysql程序。 (使用SELECT循环和更新替换)
REPLACE(TextString, '&apos;','"') ;