如何将XML放入mysql表中,保持编码


How can I put XML into mysql tables, keeping encoding?

我有一个XML文件,其中包含来自latin1编码、latin1_swidish_ci整理表的数据,我想将其传输到另一个mysql表。我已经用相同的编码设置了目标表。我在数据库中查询表中的每一行,结果发现所有的特殊字符都搞砸了。我还在XML文件<?xml version="1.0" encoding="latin1" ?>中设置了编码。这会是PHP的问题吗?我必须在其他地方设置编码吗:

这是我的脚本:

    // 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>

您不需要在PHP中设置编码。您应该使用SET NAMES 'latin1'作为第一个SQL语句。

更新:

我认为您的服务器配置错误。我已经运行了这个代码,所有的工作都很完美

<?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>