2011-11-25 24 views
5

私の前身である(MySQL)データベースには、多くのHTMLエンティティが含まれています(例えば、の代わりに€)。データベースからHTMLエンティティを削除する

データベースに生データが含まれている必要があります(データベースはHTMLとは関係ありません)。データベースから削除して適切なUTF8に保存したいのですが、コロケーションはすでにそのとおりです。

これを修正するにはどうすればよいでしょうか?私が考えることができる唯一のことは、すべてのデータを取得し、html_entity_decode()を実行してそれを書き戻すPHPスクリプトを書くことです。これは1回限りの操作であり、DBの容量は約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でこれらのエンティティを変換すると、大量のデシジョンロジックが発生します。しかし、私はあなたがSQLを使用する必要がある場合を考えることができる一つの方法は、esentially(当時だ/または多くの場合の)で、巨大なcase文を持っていることを、ユーザー定義関数を作成することです

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

次に、あなたは単に次のようなことをする必要があります:

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

これは、理論上、きれいな表を返します。

1

私はmysqlプロシージャを作成する必要があります。 (SELECTループと更新置換あり)
REPLACE(TextString, '&apos;','"') ;

関連する問題