2013-05-13 122 views
0

我有一個PHP代碼,用於解析XML文件並將解析的信息存儲在我的Linux服務器上的數據庫(MySQL)中。 我所有的表排序都是'utf8_unicode_ci',即使我的數據庫排序規則是'utf8_unicode_ci' 我的XML文件中有很多語言(土耳其語,瑞典語,法語,...),我希望這些語言中的特殊字符存放在原來的形式,但我的問題是,像這樣的XML模式:SQL排序規則問題

<match date="24.08.2012" time="17:00" status="FT" venue="Stadiumi Loro Boriçi (Shkodër)" venue_id="1557" static_id="1305963" id="1254357"> 

會場值將被存儲在我的數據庫是這樣的:

Stadiumi Loro Boriçi (Shkodër) 

任何人可以幫我存儲值在我的數據庫,因爲它是?

+0

哪種整理是你的數據庫? – medina 2013-05-13 06:46:52

+0

我說這是utf8_unicode_ci – 2013-05-13 06:50:38

回答

0

嘗試在查詢前使用「SET NAMES utf8」命令。正如manual所說:

SET NAMES指示客戶端將用於發送SQL語句到服務器的字符集。

我試圖模仿你的情況。創建表test1:

DROP TABLE IF EXISTS `test1`; 
CREATE TABLE `test1` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `value` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

並試圖插入一個帶有法語特殊字符和中文的字符串。對我而言,即使沒有SET NAMES,它也能正常工作。

<?php 
$str = "çëÙùÛûÜüÔô漢語漢語"; 

try { 

     $conn = new PDO('mysql:host=localhost;dbname=test', 'user', ''); 
     $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $conn->exec("SET NAMES utf8"); 
     $stmt = $conn->prepare('INSERT INTO test1 SET value = :value'); 
     $stmt->execute(array('value' => $str)); 

     //select the inserted row 
     $stmt = $conn->prepare('SELECT * FROM test1 WHERE id = :id'); 
     $stmt->execute(array('id' => 1)); 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      print_r($row); 
     } 
} 
catch(PDOException $e) { 
     echo 'ERROR: ' . $e->getMessage(); 
} 

它工作正常,印刷本:

Array 
(
    [id] => 1 
    [value] => çëÙùÛûÜüÔô漢語漢語 
) 

此外,當您正在測試不直接從控制檯讀取,輸出重定向到一個文件,並用文本編輯器打開它:

php test.php > 1.txt 
+0

我用SET NAMES使用utf8,它完美的工作 – 2013-05-13 10:15:32