2011-11-25 3 views
5

이전에 사용하던 (MySQL) 데이터베이스에 많은 HTML 엔티티 (예 : 대신 €)가 포함되어있어 오류가 발생했습니다.데이터베이스에서 HTML 엔티티 제거

데이터베이스에 원시 데이터 (HTML과 관련이 없어야 함)가 있어야하므로 DB에서 제거하고 적절한 UTF8에 저장하려고합니다. 배열은 이미 그 것입니다.

이 문제를 해결하는 좋은 방법은 무엇입니까? 내가 생각할 수있는 유일한 방법은 모든 데이터를 가져 와서 html_entity_decode()를 통해 실행하고 다시 작성하는 PHP 스크립트를 작성하는 것입니다. 일회성 작업이고 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에서 이러한 많은 엔트리를 변환하는 것은 엄청난 양의 욕구 논리를 유발할 것입니다.

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

:

그러나, 나는 당신이 SQL을 사용해야하는 경우 생각할 수있는 한 가지 방법은, 사용자 정의 esentially에서 큰 경우 문이 함수 (또는/다음의 경우 많은)를 만드는 것입니다 그렇다면 단순히 다음과 같이 할 수 있어야합니다.

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

정리 된 표를 반환해야합니다.

1

나는 mysql 프로 시저를 만들 필요가있다. (SELECT 루프 및 업데이트 대체 포함)
REPLACE(TextString, '&apos;','"') ;

관련 문제