PHP 與 MS SQL 使用 UTF-8 溝通的解決方式
最近正在處理的 CASE 使用 PHP 與 MS SQL 做溝通,但是內容都是使用 nvarchar 與 ntext ,儲存的內容是 UTF-8 的格式,結果呢,使用 PHP 內建的 PDO DRIVER 都無法正確讀出 UTF-8 資料,只可以拿回 BIG5 的資料,在利用 ICONV 函數轉回 UTF-8 交給 AMFPHP 使用,但是還真的很麻煩阿。
在一般的寫法,我們會使用 MSSQL 的函數,又或者是我們使用 PHP 5 才提供的 PDO 物件,來做資料庫的存取,但是不管我們怎麼寫,AMFPHP 讀回來的永遠是一堆亂碼。
程式碼 => PDO MSSQL
public function test1(){ $dsn = "mssql:host=10.0.1.110;dbname=PCLIS;charset=UTF8;"; $db = new PDO($dsn,dbusername,dbpassword); //$db->query("SET CHARACTER_SET_RESULTS=utf8"); $rs = $db->query("select * from tb01"); $str = $rs->fetch(); return $str['test']; } |
可是如果我們將讀取回來的資料使用 ICONV 函式把資料轉一下就可以正確讀出。
程式碼 => PDO MSSQL + ICONV
public function test1(){ $dsn = "mssql:host=10.0.1.110;dbname=PCLIS;charset=UTF8;"; $db = new PDO($dsn,dbusername,dbpassword); //$db->query("SET CHARACTER_SET_RESULTS=utf8"); $rs = $db->query("select * from tb01"); $str = $rs->fetch(); return iconv('big5','utf-8',$str['test']); } |
但是麻煩事情還沒解決,通常我們在 AMFPHP 都會把整個陣列回傳到 AMFPHP 使用,但是每個內容都要經過轉碼對我們來說實在很難用。
還好,在翻微軟的資料,發現在 2009-08 的時候微軟居然有出這個東西
SQL Server Driver for PHP 1.1
而且在看文件發現, 1.1 版 可以支援 UTF-8 的資料庫編碼喔,這樣子在下 SQL 語法就不需要先將 UTF-8 轉成 BIG5 , 讀出資料也不需要再將 BIG5 轉成 UTF-8 了,的確可以省了不少事情喔。
程式碼 => 使用 SQL Server Driver for PHP 1.1
public function test2(){ $serverName = "127.0.0.1"; $connectionInfo = array("Database"=>"PCLIS","Uid"=>"sa","Pwd"=>"0000","CharacterSet" => "UTF-8"); //在這個版本,參數多了CharacterSet,可以選定UTF-8內碼 $conn = sqlsrv_connect( $serverName, $connectionInfo); if ( $conn === false ) { return sqlsrv_errors(); //die( print_r( sqlsrv_errors(), true)); } $tsql1 = "select top 10 * from 讀者檔"; //$comments ="中文資料"; //$data = iconv("utf-8", "utf-16le", $comments); //在寫入資料時,要使用iconvo做個轉換 //echo $comments; /* $params1 = array( array($data, null, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY) ) );*/ //官方並建議,sql語法最好都用參數型態來合成,並搭配 SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY來使用把參數內容置入 $stmt1 = sqlsrv_query($conn, $tsql1); if ( $stmt1 === false ) { return "Error in statement execution.<br>"; //die( print_r( sqlsrv_errors(), true)); } else { $i = 0; while( $row = sqlsrv_fetch_array( $stmt1, SQLSRV_FETCH_ASSOC)) { while (list($var,$val) = each($row)){ $var = iconv("big5","utf-8",$var); $j[$var] = $val; } $array[$i] = $j; $i++; } sqlsrv_close( $conn); return $array; } |
如此一來,就輕鬆多了,很容易可以處理資料,不過還是有一個缺點,就是如果欄位是用中文命名,還是得做一次轉碼的手續,不過如果使用數字或是英文就可以少去這個動作了。
至於大家最關心的應該還是下載位置
[ SQL server Driver for PHP 1.1 download ]
至於使用方式
只要將下載回來的 DLL 檔案都放入 EXT 資料夾中,並且在 PHP.INI 開啟對應的擴充元件,就可以使用了,下載的檔案還會包含一份 WINDOWS 說明文件,可以打開看看他更多的資料。
Random Posts
Loading…
目前並無相關文章









搞定啦!恭喜啦!
你是用zendphp嗎?
@梅干扣肉
AMFPHP 啦 ^^
注意!!
[ SQL server Driver for PHP 1.1 ] 必須搭配安裝 sql server native client 2008
如果裝到 沒有寫 2008 的版本一樣不能用喔~~
老師老師
請問你貼程式碼的語法
可以分享一下嗎?
我用的blogger也想要可以貼程式碼像你的一樣
@Forgot
不老都給你叫老了~
這套程式碼的外掛叫做 codebox
但是這是 FOR WP 用的版本
所以如果你是其他的 BLOG 可能要再找看看喔