[英]UTF-8 in SQL Server 2008 Database + PHP
我想在MS SQL 2008數據庫中使用PHP存儲數據。
我遇到像äöüß這樣的字母有問題,它們在數據庫中顯示不正確,當我在網站上顯示時。
當我對輸入數據進行utf8_encode和使用PHP輸出數據時的utf8_decode時,它可以正常工作。
還有其他更簡單的方法來解決這個問題嗎?
我已經解決了一次,問題是PHP的mssql驅動程序壞了(無法找到bugs.php.net的鏈接,但它就在那里)並且當涉及nchar和nvarchar fieldsa和utf8時失敗。 您需要稍微轉換數據和查詢:
SELECT some_nvarchar_field FROM some_table
首先,您需要將輸出更改為二進制 - 這樣它不會被破壞:
SELECT CONVERT(varbinary(MAX), some_nvarchar_field) FROM some_table;
然后在PHP中,您需要將其轉換為UTF-8,在那里您需要iconv擴展名
iconv('UTF-16LE', 'UTF-8', $result['some_nvarchar_field']);
這修復了數據庫中的選擇數據,但是,如果你想實際將一些數據放到數據庫中,或者添加一個WHERE
子句,你仍然會收到錯誤,所以WHERE
, UPDATE
, INSERT
等的修復是通過轉換來實現的。字符串到十六進制形式:
想象一下,你有這個問題:
INSERT INTO some_table (some_nvarchar_field) VALUES ('ŽČŘĚÝÁÖ');
現在,我們必須運行一些PHP:
$value = 'ŽČŘĚÝÁÖ';
$value = iconv('UTF-8', 'UTF-16LE', $value); //convert into native encoding
$value = bin2hex($value); //convert into hexadecimal
$query = 'INSERT INTO some_table (some_nvarchar_field) VALUES(CONVERT(nvarchar(MAX), 0x'.$value.'))';
查詢變為:
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));
這將有效 !
我已經使用FreeTDS在Linux上使用MS SQL Server 2008測試了這個並且它運行得很好,我有一些大型網站正在運行,沒有任何問題。
我搜索了兩天如何通過PHP將UTF-8數據(從Web表單)插入到MSSQL 2008中。 我到處讀到你不能,你需要先轉換為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
我可以通過代碼插入
$value = $_POST['first_name'];
$value = iconv("UTF-8","UCS-2LE",$value);
$value2 = $_POST['last_name'];
$value2 = iconv("UTF-8","UCS-2LE",$value2);
$query = "INSERT INTO tbl_sample(first_name, last_name) VALUES (CONVERT(VARBINARY(MAX), '".$value."') , CONVERT(VARBINARY(MAX), '".$value2."'))";
odbc_exec($connect, $query);
如果我不能搜索
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.