2014-09-07 7 views
0

내가 호스트하는 웹 사이트 중 하나는 여전히 PHP 4.0에서 MySQL 4.0으로 실행됩니다. 그 텍스트는 히브리어 (사이트에서 잘 표시됩니다)이지만 DB에서는 텍스트가 물음표가 포함 된 횡설수로 나타납니다. 다음과 같이 보입니다 : ?????£ ?§???¥ ???£ ?×???MySQL 4.0 Gibberish가 최신 버전의 MySQL로 변환 할 수 없음

나는이 DB를 MySQL 5.x로 옮기려하고 있습니다. 다른 호환 모드뿐만 아니라 MYSQL 40 호환성 모드를 사용해 보았습니다. 대상 DB에 이전 hebrew_bin 데이터 정렬이 있는지 확인하고 SET NAMES을 가지고 놀았습니다. 문제는 이것이 아직 익숙하지 않은 횡설수설 유형이므로 읽을 수있는 텍스트로 변환하는 방법을 모릅니다.

답변

0

나는 여기에 또 다른 대답을 얻지 못 했으므로 MySQL 덤프를 통하지 않고 PHP를 통해 수동으로 마이그레이션 프로세스를 수행하는 간단한 스크립트를 작성하는 것 외에는 선택의 여지가 없습니다.

다음은 스크립트입니다. 몇 가지 명백한 수정이 포함되어 있습니다. 스크립트는 "더티 코드"입니다. 보안되지 않을 수 있으며 가장 효율적이지는 않지만 내부적으로 사용하는 경우 작업을 완료해야합니다. 더 이상 수정하지 않고 스크립트가 일반인이 액세스 할 수있는 환경에서는 사용하지 마십시오.

<?php 
    $local = mysqli_connect([source server], [source username], [source password], [source DB name]) or die('No local connection'); 
    mysqli_query($local, "SET NAMES 'hebrew'"); 

    $remote = mysqli_connect([destination server], [destination username], [destination password], [destination DB name]) or die('No remote connection'); 
    mysqli_query($remote, "SET NAMES 'utf8'"); 

    $table_list = array('table1', 'table2', 'table3'); // you can get a list of tables automatically too if the list is very long 

    foreach ($table_list as $table) 
    { 
     $query_local = "SELECT * FROM `{$table}`"; 

     $result_local = mysqli_query($local, $query_local) or die('Error in q1: '.mysqli_error($local)); 

     $delete_remote = mysqli_query($remote, "DELETE FROM `{$table}` WHERE 1") or die('Error deleting table: '.$table); // necessary only if you plan to run it more than once 

     $i = 0; 
     while ($row_local = mysqli_fetch_assoc($result_local)) 
     { 
      foreach ($row_local as $key => $value) 
       $row_local[$key] = mysqli_real_escape_string($remote, $value); 

      $query_remote = "INSERT INTO `{$table}` (`".implode('`, `', array_keys($row_local))."`) VALUES ('".implode("', '", $row_local)."')"; 

      $result_remote = mysqli_query($remote, $query_remote) 
       or die('Error in remote q'.$i.' in table '.$table.':<br />&nbsp;&nbsp;'.mysqli_error($remote).'<br />&nbsp;&nbsp;Query: '.$query_remote); 

      echo 'Successfully transferred row '.$i.' in table '.$table; 
      echo '<br />'.PHP_EOL; 

      $i++; 
     } 
    } 
?>