2010-05-01 183 views
1

我使用ODBC從PHP連接到SQL Server。 在PHP中,我從SQL Server中讀取一些字符串(nvarchar列)數據,然後將其插入到mysql數據庫中。當我嘗試插入這樣的價值MySQL數據庫表我得到這個MySQL錯誤:Php/ODBC編碼問題

Incorrect string value: '\xB3\xB9ow...' for column 'name' at row 1 

對於字符串的所有ASCII字符,一切都很好,當非ASCII字符(從一些歐洲語言)存在出現問題。

所以,更一般地說:MS SQL Server數據庫中有一個Unicode字符串,它通過ODBC通過ODBC檢索。然後它被放入SQL數據庫執行的SQL插入查詢(作爲utf-8 varchar列的值)。

有人可以向我解釋在這種情況下在編碼方面發生了什麼?在哪一步可能發生字符編碼轉換?

我使用:PHP 5.2.5,MySQL5.0.45社區-NT,MS SQL Server 2005的

PHP必須在Linux的平臺上運行。

UPDATE:,當我在這個字符串調用函數utf8_encode($ S)和在MySQL中使用插入查詢該值,但隨後插入的字符串不mysql數據庫中正確顯示(這樣就不會發生錯誤utf8編碼僅用於執行正確的utf8字符串,但它丟失了正確的字符)。

+0

您僅限於使用odbc,或者您是否可以安裝/使用sqlsrv擴展? http://msdn.microsoft.com/en-us/library/cc296152%28SQL.90%29.aspx它允許您(輕鬆地)指定連接的字符集。 – VolkerK 2010-05-01 14:58:19

+0

該解決方案必須在Linux上運行,並且不幸在此平臺上不支持您提及的擴展。 – JohnM2 2010-05-01 15:04:31

+0

MySQL!= MSSQL。 – 2010-05-01 23:53:20

回答

1

也許你可以使用PDO extension,如果它有什麼區別?

有一個用戶貢獻評論here,建議將sql server中的數據類型更改爲somethig其他,如果這是不可能的看看投擲字段的用戶類。

1

我沒有使用PHP的ODBC經驗,但與MySQL函數PHP似乎默認爲ASCII和UTF8連接需要明確,如果你想避免麻煩。

你確定PHP和MySQL服務器使用UTF8進行通信嗎?直到PHP 6的Unicode支持往往是這樣惱人的不一致。

我記得MySQL文檔提到了一個連接字符串參數來調整Unicode編碼。

從您的描述中,聽起來像PHP將連接視爲僅用於ASCII。

4

首先你有DB的編碼。然後你有ODBC客戶端使用的編碼。

如果您的ODBC客戶端連接的編碼與數據庫的編碼不匹配,則在某些情況下,ODBC層會自動對您的數據進行轉碼。

這裏的技巧是強制ODBC客戶端連接的編碼。

對於 「全UTF-8」 設置:

$conn=odbc_connect(DB_DSN,DB_USR,DB_PWD); 
odbc_exec($conn, "SET NAMES 'UTF8'"); 
odbc_exec($conn, "SET client_encoding='UTF-8'"); 

// processing here 

這在PostgreSQL + PHP 5.x的作品完美 確切語法和選項取決於數據庫供應商。

你可以找到這裏的MySQL非常有用的,明確的附加信息:http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

希望這會有所幫助。