2011-11-25 103 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;','"') ;