依您的需求量身訂做,提供投資型、保障型
退休型等多元化保險商品,專業有保障
鋁門窗專業居家清潔
免費到府估價,清潔養護馬上搞定

首頁  •  tw 論壇 • 程式設計討論     • 

mysql big5 轉 utf-8

房東:阿文
發表時間:2007-03-17
[檢舉]


當網站改版時,要把以往mysql的big5資料轉換成utf-8時,常常會是個頭痛的問題。

要轉換,你的新舊資料庫都有phpmyadmin的介面,另外還得有big5->utf-8的工具,在windows上中文轉換工具首選為ConvertZ,在linux上得轉碼工具為iconv。



首先,檢查看看phpmyadmin在輸出csv檔案時會不會有問題。
stripslash為把字串去掉反斜線的函式,但是在處理big5碼的時候便會碰到難題,他會將big5的斜線去掉,以至於轉出來的文字變成亂碼。新版的phpmyadmin已經沒有這個問題,但是要看看舊版有沒有在轉出的時候加上這個函式,得把他去掉
編輯 phpmyadmin/libraries/export/csv.php
在function PMA_exportData裡頭,找到while迴圈,並找找看有沒有stripslash的function:

while ($row = PMA_DBI_fetch_row($result))
.....
$row[$j] = stripslashes($row[$j]);
把function拿掉,留下$row[$j];就好。

第二,輸出csv資料。到phpmyadmin的輸出頁面,針對舊資料庫一次一個表格輸出。調成csv匯出,存檔。

第三,匯出資料庫的結構schema。到phpmyadmin的輸出介面,針對全部的表格,調成SQL輸出,並且不要包含資料,下載回來的是單純的sql結構檔。

第四,打開convertz,對剛剛轉下來的csv轉換成utf8的動作。

第五,到新資料庫,先把剛剛.sql的結構給匯入,建立好空的table格式。如果在mysql4.1以後,如果有預設連線校對,匯入的表格統統都會用該連線校對設定。

第六,一個一個資料表,匯入剛剛存下的csv檔。

最後,檢查看看新資料庫有沒有亂碼。

這應該是個笨方法,不過目前沒有出現中文轉換的問題。如果一直試不成功\,不妨也可以試看看這個笨方法。





  • 贊助網站       

    廣利不動產-新板特區指名度最高、值得您信賴的好房仲
    您的托付,廣利用心為您服務
    廣利不動產-板橋在地生根最實在--新板特區指名度最高、值得您信賴的好房仲
    完整房訊,房屋、店面熱門精選物件,廣利不動產 優質仲介,房屋租賃、買賣資訊透明,交易真安心!

  • 1 樓住戶:小橋
    發表時間:2007-03-17
    [檢舉]

    將 big5 轉成 utf-8 環境 :

    所以寫了這支程式 ,

    這支程式 會 dump 出 db 下的所有 insert 的 query ,

    使用方法

    1.

    將 big5 環境的 create dump 出來 ,

    然後 再將 CHARSET=latin1 或 CHARSET=big5

    改成 CHARSET=utf8

    然後 create 一個空的 databases + table .

    2.
    下載 metabase : 請參考附件

    3.
    convert.php
    CODE:

    #!/usr/bin/php -q
    set_time_limit(0) ;
    ############################################################################
    # sql link start
    ############################################################################
    $db_type = "mysql";
    $host_name = "localhost" ;
    $database_name = "heyforum_dz5" ;
    $user_id = "root" ;
    $user_password = "xxxxxxxxxxxx" ;
    include_once("metabase/metabase_interface.php");
    include_once("metabase/metabase_database.php");
    $db_params=array(
    "Host" =>$host_name
    ,"Type" =>$db_type
    ,"User" =>$user_id
    ,"Password" =>$user_password
    ,"IncludePath" =>"metabase/"
    ,"Persistent" =>0
    );
    ############################################################################
    # sql link end
    ############################################################################

    $error=MetabaseSetupDatabase($db_params,$db);
    MetabaseSetDatabase($db,$database_name);

    $query ="show tables";
    $db_res=MetabaseQuery($db,$query);
    if(!$db_res) {
    ecstart_alert_err($msg["system_err"]);
    }
    $rows=MetabaseNumberOfRows($db,$db_res);
    MetabaseGetColumnNames($db,$db_res,$db_field_name);
    if($rows)
    {
    for($row=1;$row<=$rows;$row++)
    {
    if(is_array($db_field_name)){
    foreach($db_field_name as $key => $value){
    $table[$row-1]=MetabaseFetchResult($db,$db_res,$row-1,$key) ;
    }
    }
    }
    }
    if(is_array($table)){
    foreach($table as $k => $v){
    $query ="describe ".$v;
    $db_res=MetabaseQuery($db,$query);
    if(!$db_res) {
    ecstart_alert_err($msg["system_err"]);
    }
    $rows=MetabaseNumberOfRows($db,$db_res);
    MetabaseGetColumnNames($db,$db_res,$db_field_name);
    if($rows)
    {
    for($row=1;$row<=$rows;$row++)
    {
    if(is_array($db_field_name)){
    foreach($db_field_name as $key => $value){
    $field[$v][$row-1]=MetabaseFetchResult($db,$db_res,$row-1,"field") ;
    }
    }
    }
    }
    //print_r($field);



    }
    }




    if(is_array($field)){
    foreach($field as $k => $v){
    // get field value
    $query ="select * from ".$k;
    $db_res=MetabaseQuery($db,$query);
    if(!$db_res) {
    ecstart_alert_err($msg["system_err"]);
    }
    $rows=MetabaseNumberOfRows($db,$db_res);
    MetabaseGetColumnNames($db,$db_res,$db_field_name);
    if($rows)
    {
    for($row=1;$row<=$rows;$row++)
    {
    if(is_array($db_field_name)){
    foreach($db_field_name as $key => $value){
    $field_value[$row-1][$key]=MetabaseFetchResult($db,$db_res,$row-1,$key) ;

    }
    }
    $no = 0 ;
    $field_str = "";
    foreach($v as $fv){
    if($no == 0){
    $field_str .= "`".$fv."`";
    }
    else{
    $field_str .= ",`".$fv."`";
    }
    $no = $no+1 ;
    }

    $sno = 0 ;
    $field_value_str = "";
    foreach($field_value[$row-1] as $fvk => $fvv){
    if($sno == 0){
    $field_value_str .= "'".mysql_escape_string(iconv('BIG5','UTF-8',$fvv))."'";
    }
    else{
    $field_value_str .= ",'".mysql_escape_string(iconv('BIG5','UTF-8',$fvv))."'";
    }
    $sno = $sno+1 ;
    }


    $query = "insert into ".$k."(".$field_str.") values(".$field_value_str.");";
    unset($field_value[$row-1]);
    unset($field_str);
    unset($field_value_str);
    echo $query . "\n";
    //print_r($field_value);
    }
    }

    unset($field_value);
    }
    }





    MetabaseCloseSetup($db)

    ?>
    4.
    將 convert.php 存檔後

    執行 ./convert.php > convert.sql

    5. mysql database_name -uroot -p < convert.sql

    好了



     共 1 人回應  選擇頁數 【第1 頁】 

    姓名:
    佈告內容: