首頁 > FLEX, PHP, 程式設計, 網頁設計 > PHP 與 MS SQL 使用 UTF-8 溝通的解決方式

PHP 與 MS SQL 使用 UTF-8 溝通的解決方式

2009年10月5日  瀏覽次數 : 13,105

最近正在處理的 CASE 使用 PHP 與 MS SQL 做溝通,但是內容都是使用 nvarchar 與 ntext ,儲存的內容是 UTF-8 的格式,結果呢,使用 PHP 內建的 PDO DRIVER 都無法正確讀出 UTF-8 資料,只可以拿回 BIG5 的資料,在利用 ICONV 函數轉回 UTF-8 交給 AMFPHP 使用,但是還真的很麻煩阿。

image 如果使用一般的 PDO 讀取,拿到的資料都是亂碼。

在一般的寫法,我們會使用 MSSQL 的函數,又或者是我們使用 PHP 5 才提供的 PDO 物件,來做資料庫的存取,但是不管我們怎麼寫,AMFPHP 讀回來的永遠是一堆亂碼。

程式碼 => PDO MSSQL

1 2 3 4 5 6 7 8 9 10 11 12
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

1 2 3 4 5 6 7 8 9 10 11 12
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']);
	}

image 如此一來 : 就可以正確讀到 UTF-8 的中文字了

但是麻煩事情還沒解決,通常我們在 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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
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;
		}

image 如此一來,就輕鬆多了,很容易可以處理資料,不過還是有一個缺點,就是如果欄位是用中文命名,還是得做一次轉碼的手續,不過如果使用數字或是英文就可以少去這個動作了。

 

至於大家最關心的應該還是下載位置

[ SQL server Driver for PHP 1.1 download ]

至於使用方式

只要將下載回來的 DLL 檔案都放入 EXT 資料夾中,並且在 PHP.INI 開啟對應的擴充元件,就可以使用了,下載的檔案還會包含一份 WINDOWS 說明文件,可以打開看看他更多的資料。

Random Posts

Loading…

:: 把這篇好文推到書籤網站與更多人分享吧 ::
  • funp
  • Hemidemi
  • YahooKimo
  • Google
  • udn
  • Haohao
  • Live

目前並無相關文章

Ausir FLEX, PHP, 程式設計, 網頁設計 ,

  1. 2009年10月5日16:44 | #1

    搞定啦!恭喜啦!
    你是用zendphp嗎?

  2. 2009年10月5日17:38 | #2

    @梅干扣肉

    AMFPHP 啦 ^^

  3. 2009年10月31日12:34 | #3

    注意!!

    [ SQL server Driver for PHP 1.1 ] 必須搭配安裝 sql server native client 2008

    如果裝到 沒有寫 2008 的版本一樣不能用喔~~

  4. Forgot
    2009年11月23日18:16 | #4

    老師老師

    請問你貼程式碼的語法
    可以分享一下嗎?
    我用的blogger也想要可以貼程式碼像你的一樣

  5. 2009年11月24日09:30 | #5

    @Forgot

    不老都給你叫老了~

    這套程式碼的外掛叫做 codebox

    但是這是 FOR WP 用的版本
    所以如果你是其他的 BLOG 可能要再找看看喔

  1. 本篇文章目前尚無任何 trackbacks 和 pingbacks。