2011-01-11 73 views
6

我正在寫一個PHP腳本從Microsoft SQL Server 2008數據庫將數據導入MYSQL數據庫。爲什麼將MS SQL數據轉換爲MYSQL時會出現無效字符?

MSSQL服務器設置爲「SQL_Latin1_General_CP1_CI_AS」的排序規則,所涉及的數據存儲在「nchar」類型的列中。

我的PHP網頁使用

<meta http-equiv="content-type" content="text/html; charset=utf-8"> 

表明,他們應該使用UTF-8字符編碼來顯示。

我使用sqlsrv PHP擴展從MSSQL數據庫中提取數據。

$sql = 'SELECT * FROM [tArticle] WHERE [ID] = 6429'; 
$stmt = &sqlsrv_query($dbHandler, $sql); 

while ($row = sqlsrv_fetch_object($stmt)) { 
    // examples of what I've tried simply to display the data 
    echo $row->Text1; 
    echo utf8_encode($row->Text1); 
    echo iconv("ISO-8859-1", "UTF-8", $row->Text1); 
    echo iconv("ISO-8859-1", "UTF-8//TRANSLIT", $row->Text1); 
} 

暫時忘記將數據插入MYSQL數據庫。我無法在我的PHP頁面中正確顯示字符串。從我上市的例子:

echo $row->Text1 

是我的瀏覽器呈現爲明顯無效的字符:「露西」

所有下面的一個實例呈現爲空白:「露西」

它看起來像一個字符集不匹配的問題,但我怎樣才能讓這些數據正確顯示從MS SQL數據庫(不改變我的網頁編碼)?如果我能弄清楚,我可以將它存儲在MYSQL數據庫部分。

+0

我還沒有和SQLSRV的工作,但你可能需要在連接到數據庫中去設置它的連接編碼。連接後在mysql下運行`SET NAMES utf8`。 – Fanis 2011-01-11 23:25:41

回答

13

如果源數據庫中的字符串以UTF-8編碼,則應使用utf8_decode而不是utf8_encode

但它們可能是編碼在一些拉丁語或「西方」Windows code page。所以我會嘗試iconv("CP1252", "UTF-8", $row->Text1);,例如。

另一種替代方法是運行顯式設置已知編碼的SQL查詢。例如,根據Windows Collation Name (Transact-SQL)文檔,此查詢將使用代碼頁1252對字段Text1進行編碼:SELECT Text1 COLLATE SQL_Latin1_General_CP1_CI_AS FROM ...

+1

帶有「CP1252」的iconv做了一招,這對我來說很奇怪,因爲「nchar」字段上的MS文檔聲稱這是一個用UCS-2字符集編碼的unicode字段。感謝修復! – rushinge 2011-01-12 18:18:10

7

試試這個命令它的工作對我來說:

$connectionInfo = array("Database"=>"DBName", "CharacterSet" =>"UTF-8"); 
+0

非常感謝...你剛剛救了我的一天! – 2017-10-31 16:23:11

相關問題