2009-08-24 53 views
20

我想通過php在SQL Server數據庫中存儲一些數據。PHP + SQL Server - 如何設置連接字符集?

問題是特殊字符沒有正確轉換。我的應用的字符集是iso-8859-1 ,服務器使用的是windows-1252。

在插入前手動轉換數據沒有幫助,似乎有一些 轉換正在進行。

運行SQL查詢'set char_convert off'也沒有幫助。

任何人有任何想法我可以得到這個工作?編輯:

編輯:我試過ini_set('mssql.charset','windows-1252');同樣,也沒有結果。

+0

mssql.charset僅適用於FreeTDS。此配置參數是否顯示在服務器上的phpinfo()中? – VolkerK 2009-08-24 14:12:49

+0

是的,它確實顯示出來。 Phpinfo還聲明MSSQL Library版本是FreeTDS。 本地值:windows-1252 主值:無值 – Maurice 2009-08-24 14:58:45

回答

19

客戶端字符集是必要但不充分:: 然而,在大寫的工作

ini_set('mssql.charset', 'UTF-8'); 

我搜索了兩天如何插入UTF-8的數據(從網頁表格)進入2008年MSSQL通過PHP。我在任何地方都能看到你不能,你需要先轉換成UCS2(就像cypher的解決方案推薦)。 在Windows SQLSRV說是一個很好的解決方案,這是我不能嘗試,因爲我在Mac OSX上發展。

然而,freetds的手動(什麼PHP MSSQL使用的OSX)說,開引號前面加一個字母「N」:

mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的採購批發平臺')", +xon); 

根據這一討論,N字,告訴服務器轉換爲Unicode 。 https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

+0

節省我的一天,非常感謝。 – 2017-11-17 10:42:52

0

你就不能轉換你的表到您的應用程序編碼?或者在兩者中使用utf-8?

雖然我不知道MSSQL是否支持表級別的編碼。

此外,如果上述失敗,請嘗試MB(多字節)字符串函數。

+0

不幸的是,我不能。因爲它不是我的數據庫,也不是我的框架。將特殊字符轉換爲實體也不是一個選項,因爲還有一些非網絡軟件連接到這個數據庫。 我習慣使用iconv進行轉換,但我會給MB試一試。 – Maurice 2009-08-24 16:52:29

+0

與mb相同的結果。發送數據到數據庫似乎有一些自動轉換完成。 – Maurice 2009-08-25 11:07:34

2

我已經在類似情況的運氣(使用PDO ODBD連接)使用下面的代碼打印輸出前向編碼轉換:

$data = mb_convert_encoding($data, 'ISO-8859-1', 'windows-1252'); 

我不得不手動設置源編碼,因爲它錯誤地被mb_detect_encoding()報告爲「ISO-8859-1」。

我的數據也被另一個應用程序存儲在數據庫中,所以我可能處於一種獨特的情況,儘管我希望它有幫助!

4

我建議看以下幾點:

  1. 確保您要存儲的信息的列是的ncharnvarchar的爲char和nvarchar不支持UCS-2(SQLServer的不BTW UTF-8格式存儲)
  2. 如果你與mssql library/extension爲PHP連接,運行:ini_set('mssql.charset', 'utf-8');因爲有一個字符集參數無功能(連接,查詢等)
  3. 確保您的瀏覽器的字符集也被設置爲UTF-8
+0

另外,如果您使用的是Zend_Db,那麼在初始化連接時不要忘記charset參數:... params.charset =「utf8」 – 2012-02-13 12:20:36

5

我有同樣的問題,ini_set('mssql.charset', 'utf-8')沒有爲我工作。

ini_set('mssql.charset', 'UTF-8'); 
4

如果您使用的是TDS協議版本7或更高版本,則線路上的所有通信都將轉換爲UCS2。除非列是nvarchar或ntext,否則服務器將從UCS2轉換爲設置爲表或列的排序規則。您可以 UTF-8到正規的varchar或文本,你就必須使用TDS協議版本低於7,如6.0或4.2。用這種方法唯一的缺點是你不能查詢任何數據類型爲nvarchar,ntext或SYS *表(我想你也不會做任何CAST()荷蘭國際集團) - 作爲服務器拒絕發送任何有可能會被轉換爲UTF-8使用協議版本低於7.

這是不可能的,以避免使用TDS協議版本7或更高(大約相當於2005或更新MSSQL)時轉換的字符集的任何客戶端。

+3

在Linux系統上,您可以在'freetds.conf'中通過在參數分組'[global]'下指定以下選項來設置此TDS協議版本 - 'tds version = 8.0' 'client charset = UTF-8'請參閱:https://gist.github.com/johnkary/6643856 – 2013-09-20 21:03:04

2

對我來說,編輯這個文件:
/etc/freetds/freetds.conf
...和改變/設置 'TDS版本' 參數 '7.0' 的幫助。編輯您的freetds.conf並嘗試更改您的服務器配置(或全局)的此參數。

它甚至沒有工作的Apache重新啓動。

1

如果ini_set('mssql.charset', 'UTF-8');不幫助你,你沒有root訪問權限修改系統範圍freetds.conf文件,這裏是你可以做什麼:

設置/your/local/freetds.conf文件:

[sqlservername] 
    host=192.168.0.56 
    port=1433 
    tds version=7.0 
    client charset=UTF-8 

2.確保您連接DSN是使用服務器名,而不是IP:

'dsn' => 'dblib:host=sqlservername;dbname=yourdb 

讓freetds的通過ENV變量使用本地freetds.conf文件從PHP腳本未經授權的用戶:

putenv('FREETDSCONF=/your/local/freetds.conf'); 
0

你應該設置的字符集與的ini_set( 'mssql.charset', 'windows-1252')連接之前。如果您在 mssql_connect後使用它沒有任何效果。

0

只是加入ini_set('mssql.charset', 'UTF-8');並沒有幫助我在我的情況。我必須在列上指定UTF-8字符集:

$age = 30; 
$name = utf8_encode("Joe");  

$select = sqlsrv_query($conn, "SELECT * FROM Users WHERE Age = ? AND Name = ?", 
    array(array($age), array($name, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('UTF-8')));