2011-01-09 46 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>'; 
相关问题