2011-01-09 48 views
3

我試圖將希臘數據庫轉換爲utf8。在這一點上,我已經想出瞭如何做到這一點(通過MySQL,而不是通過iconv()函數),但我有一個問題:應用程序以php序列化格式(通過serialize())存儲大量數據在數據庫中。簡單的方法將php序列化的字符串轉換爲utf8?

正如你可能知道,這種格式存儲在序列化的字符串的字符串長度。這意味着由於轉換後的長度會發生變化(因爲php5不能正確支持Unicode),所以這些字符串不能再被反序列化。

到目前爲止,我使用下列方法之一來解決此考慮:

  1. 用PHP這些字符串轉換爲utf8,而不是轉換的整個序列化的字符串,它反序列化和轉換數組中的每個項目。
  2. 編寫腳本以重新計算序列化字符串的長度。

選項#2似乎更容易,但我想有一個更快的方法來做到這一點。也許即使是一個免費的腳本來轉換它們,因爲我絕對不是第一個面對這個問題的人。有任何想法嗎?

在此先感謝。

回答

0

選項#1聽起來比較容易,而且對我來說錯誤更少。

你很可能只是反序列化,然後用array_walk_recursive()做對每個字符串

1

轉換做一個SHOW CREATE TABLE和檢查表的編碼。然後使用相同的編碼連接到數據庫(執行'編碼'的USE')。

現在,當您檢索序列化的字符串反序列化()它。無論您的應用程序傳遞給serialize(),返回值都是。

一旦你來到這裏,你需要知道的編碼字符串最初的插入內容(如ISO-8859-1,CP1252,等...),所以你可以將其轉換爲UTF-8。

現在,你有你的希臘,沒有雙關語意,轉化爲你可以把它放回數據庫中的UTF-8字符串。

我會強烈建議您重新組織數據庫不使用序列化的字符串來存儲數據。如果要將BLOBS存儲在數據庫中,請考慮將它們移出數據庫並將它們存儲在文件系統中。

祝你好運。

0

這是做它的具體代碼。而就在TODO關鍵字插入您的設置/代碼:

//TODO: insert your settings here 
$database = 'your_db_name'; 
$table = 'your_table_name'; 
$column = 'column_that_needs_conversion'; 
$primarykey = 'name_of_primary_key_in_that_table'; 

if (mb_internal_encoding() != 'UTF-8') { 
    die('This script must be run in an UTF-8 environment!'); 
} 

$utf8_encode_callback = create_function('&$item,$key', 'if (is_string($item)) $item = utf8_encode($item);'); 

$tablecol = $table .'.'. $column; 
$getvaluesSQL = "SELECT ". $tablecol ." AS thevalue, ". $primarykey ." AS primkey FROM ". $database .".". $table ." WHERE ". $tablecol ." IS NOT NULL AND LENGTH(". $tablecol .") > 0"; 

//TODO: insert code here for executing $getvaluesSQL against your database 

if (mysqli_num_rows($db_getvalues) > 0) { 
    while ($getvalues = mysqli_fetch_assoc($db_getvalues)) { 
     $php = unserialize(utf8_decode($getvalues['thevalue'])); 

     if (is_array($php)) { 
      array_walk_recursive($php, $utf8_encode_callback); 
     } elseif (is_string($php)) { 
      $php = utf8_encode($php); 
     } 

     $new_ser = serialize($php); 

     # For checking that conversion happened correctly (compare the two files): 
     #file_put_contents('c:/dump0.txt', $getvalues['thevalue'] ."\r\n", FILE_APPEND); 
     #file_put_contents('c:/dump1.txt', $new_ser ."\r\n", FILE_APPEND); 

     $sql = "UPDATE ". $database .".". $table ." SET ". $tablecol ." = '". sql_esc($new_ser) ."' WHERE ". $primarykey ." = ". $getvalues['primkey']; 

     //TODO: insert code here for executing $sql against your database 

    } 
} 
echo '<div>Done with '. $tablecol .'</div>'; 
相關問題