由於我的前任錯誤,我想使用的一個(MySQL)數據庫包含很多HTML實體(例如€
而不是€
)。從數據庫中刪除html實體
隨着數據庫應該包含原始數據(數據庫不應該有任何與HTML做的),我想從數據庫中刪除,並將其存儲在適當的UTF8,搭配已經是這一點。
什麼是解決這一問題的好辦法?我唯一能想到的是編寫一個PHP腳本來獲取所有數據,通過html_entity_decode()運行並寫回。這是可行的,因爲它是一次性操作,數據庫只有大約100MB,但仍不夠理想。
任何想法?
由於我的前任錯誤,我想使用的一個(MySQL)數據庫包含很多HTML實體(例如€
而不是€
)。從數據庫中刪除html實體
隨着數據庫應該包含原始數據(數據庫不應該有任何與HTML做的),我想從數據庫中刪除,並將其存儲在適當的UTF8,搭配已經是這一點。
什麼是解決這一問題的好辦法?我唯一能想到的是編寫一個PHP腳本來獲取所有數據,通過html_entity_decode()運行並寫回。這是可行的,因爲它是一次性操作,數據庫只有大約100MB,但仍不夠理想。
任何想法?
由於沒有人可以提供令人滿意的僅限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();
}
?>
根據數據庫(Oracle,MySql等)以及是否可以將其脫機,您可能可以將所有DDL和數據導出爲大型SQL腳本(包含所有表的INSERT)。然後,你可以做一個標準的查找/替換使用sed
:
sed -i 's/€/€/g' script.sql
然後刪除數據庫或截斷表,使用該腳本重新創建它。
最後,我想你將不得不訴諸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
這應該在理論上返回給你一個清理過的表。
我tnink u需要創建一個mysql程序。 (使用SELECT循環和更新替換)REPLACE(TextString, ''','"') ;
工作,你也許可以做簡單的字符串更新查詢查找/替換。但是,如果種類繁多,那麼請使用PHP往返選項。 –
有超過50個實體在使用這個數據庫孤獨,HTML允許每個字符寫爲使用xx;語法HTML實體,所以它不是爲搜索和替換一樣簡單。 – dtech