2012-09-10 67 views
1

我有一個XML文件,其中包含latin1編碼的latin1_swedish_ci整理表,我想將它轉移到另一個mysql表中。我用相同的編碼設置了目標表。我查詢表中每一行的數據庫,並最終弄亂了所有特殊字符。我還在XML文件<?xml version="1.0" encoding="latin1" ?>中設置了編碼。它可以成爲PHP的問題嗎?我必須設置編碼別處:如何將XML放入MySQL表中,保持編碼?

這裏是我的腳本:

// create table courses if not exists 
echo("Creating new tables...\n"); 
if (!mysql_query("CREATE TABLE IF NOT EXISTS members (
    id int(11) NOT NULL, 
    isfg_no int(11) NOT NULL, 
    lab_id int(11) NOT NULL, 
    first varchar(256) NOT NULL, 
    last varchar(512) NOT NULL, 
    PRIMARY KEY (id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1")) 
    die(mysql_error()); 

    // load xml file 
echo "Loading XML file...\n"; 
$members = simplexml_load_file("members.xml"); 

foreach ($members as $row) { 
    $id = mysql_real_escape_string($row->SO_IdSocio); 
    $isfg_no = mysql_real_escape_string($row->SO_Numisfg); 
    $lab_id = mysql_real_escape_string($row->SO_Numlab); 
    $first = mysql_real_escape_string($row->SO_Nombre); 
    $last = mysql_real_escape_string($row->SO_Apellidos); 

    if (!mysql_query("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')")) 
     die(mysql_error()); 
} 

下面是一些XML的

<?xml version="1.0" encoding="latin1" ?> 
<SOCIOS_INTRA> 
<row> 
    <SO_IdSocio>1</SO_IdSocio> 
    <SO_Numsocio>001</SO_Numsocio> 
    <SO_Numisfg>404</SO_Numisfg> 
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab> 
    <SO_Numlab>0</SO_Numlab> 
    <SO_Nombre>******</SO_Nombre> 
    <SO_Apellidos>*******</SO_Apellidos> 
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion> 
    <SO_Cp>28001</SO_Cp> 
    <SO_Poblacion>Madrid</SO_Poblacion> 
    <SO_Provincia>Madrid</SO_Provincia> 
    <SO_Idpais>25</SO_Idpais> 
    <SO_Email1>*******</SO_Email1> 
    <SO_Email2></SO_Email2> 
    <SO_Telefono>***</SO_Telefono> 
    <SO_Fax>****</SO_Fax> 
    <SO_Login></SO_Login> 
    <SO_Password></SO_Password> 
    <SO_Fecha>19960101</SO_Fecha> 
    <SO_SituacionISFG>0</SO_SituacionISFG> 
    <SO_SituacionGEP>1</SO_SituacionGEP> 
    <SO_Observaciones></SO_Observaciones> 
</row> 
+0

你可以用'blob's /二進制,而不是文本 - 他們以犧牲性能爲代價保全編碼。 – Christian

回答

1

你並不需要設置編碼在PHP 。您應該使用SET NAMES 'latin1'作爲第一個SQL語句。

UPDATE:

我認爲你已經錯誤地配置服務器。我已經運行該代碼和所有工作完全

<?php 

$lnk=mysql_connect('localhost', 'root', ''); 
mysql_select_db('test', $lnk); 

echo("Creating new tables...\n"); 
if (!mysql_query("CREATE TABLE IF NOT EXISTS members (
    id int(11) NOT NULL, 
    isfg_no int(11) NOT NULL, 
    lab_id int(11) NOT NULL, 
    first varchar(256) NOT NULL, 
    last varchar(512) NOT NULL, 
    PRIMARY KEY (id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1")) 
    die(mysql_error()); 

    // load xml file 
echo "Loading XML file...\n"; 
$members = simplexml_load_file("members.xml"); 

foreach ($members as $row) { 
    $id = mysql_real_escape_string($row->SO_IdSocio); 
    $isfg_no = mysql_real_escape_string($row->SO_Numisfg); 
    $lab_id = mysql_real_escape_string($row->SO_Numlab); 
    $first = mysql_real_escape_string($row->SO_Nombre); 
    $last = mysql_real_escape_string($row->SO_Apellidos); 

    if (!mysql_query("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')")) 
     die(mysql_error()); 
    else 
     print("INSERT INTO members (id, isfg_no, lab_id, first, last)VALUES ('$id', '$isfg_no', '$lab_id', '$first', '$last')<br />"); 
} 

?> 

這個XML

<?xml version="1.0" encoding="latin1" ?> 
<SOCIOS_INTRA> 
<row> 
    <SO_IdSocio>2</SO_IdSocio> 
    <SO_Numsocio>001</SO_Numsocio> 
    <SO_Numisfg>404</SO_Numisfg> 
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab> 
    <SO_Numlab>0</SO_Numlab> 
    <SO_Nombre>******</SO_Nombre> 
    <SO_Apellidos>*******</SO_Apellidos> 
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion> 
    <SO_Cp>28001</SO_Cp> 
    <SO_Poblacion>Madrid</SO_Poblacion> 
    <SO_Provincia>Madrid</SO_Provincia> 
    <SO_Idpais>25</SO_Idpais> 
    <SO_Email1>*******</SO_Email1> 
    <SO_Email2></SO_Email2> 
    <SO_Telefono>***</SO_Telefono> 
    <SO_Fax>****</SO_Fax> 
    <SO_Login></SO_Login> 
    <SO_Password></SO_Password> 
    <SO_Fecha>19960101</SO_Fecha> 
    <SO_SituacionISFG>0</SO_SituacionISFG> 
    <SO_SituacionGEP>1</SO_SituacionGEP> 
    <SO_Observaciones></SO_Observaciones> 
</row><row> 
    <SO_IdSocio>3</SO_IdSocio> 
    <SO_Numsocio>001</SO_Numsocio> 
    <SO_Numisfg>404</SO_Numisfg> 
    <SO_Nombrelab>SIN LABORATORIO</SO_Nombrelab> 
    <SO_Numlab>0</SO_Numlab> 
    <SO_Nombre>******</SO_Nombre> 
    <SO_Apellidos>*******</SO_Apellidos> 
    <SO_Direccion>C/Recoletos 22, 3ª planta</SO_Direccion> 
    <SO_Cp>28001</SO_Cp> 
    <SO_Poblacion>Madrid</SO_Poblacion> 
    <SO_Provincia>Madrid</SO_Provincia> 
    <SO_Idpais>25</SO_Idpais> 
    <SO_Email1>*******</SO_Email1> 
    <SO_Email2></SO_Email2> 
    <SO_Telefono>***</SO_Telefono> 
    <SO_Fax>****</SO_Fax> 
    <SO_Login></SO_Login> 
    <SO_Password></SO_Password> 
    <SO_Fecha>19960101</SO_Fecha> 
    <SO_SituacionISFG>0</SO_SituacionISFG> 
    <SO_SituacionGEP>1</SO_SituacionGEP> 
    <SO_Observaciones></SO_Observaciones> 
</row> 
</SOCIOS_INTRA> 
+0

仍然無法正常工作。我也嘗試通過phpMyAdmin上傳一個csv文件,它不起作用。我不明白爲什麼我可以在文本編輯器中正確讀取XML文件,但在轉儲到數據庫時看不到它。任何猜測? – ehp

+0

從php/phpmyadmin導入時是否有一些SQL錯誤消息? –

+0

沒有。一切順利,但我得到了同樣的結果。 – ehp