今日公司遇到這個問題 , Client 端網頁為 UTF-8 編碼, 採用 Linux+PHP 架構想連接 MS SQL Server 2008 , 結果遇上亂碼問題 , 過去曾有解決過這個問題,但時隔多日早就忘了 , Try 過甚麼 php.ini 的 mssql.charset 設定都沒用。
回家後定下心來,回想過去怎麼作的,順便找找資料。當然終於被我找到了,大部分的解決方式是修改 /etc/freetds.conf 設定檔不然就用 iconv 函數自己寫一堆程式來轉編碼 >< ...,但時隔這麼多年,PHP 沒有在 Linux 上對 MSSQL 支援有長進,仍然是要改設定檔嗎 ? 看來是的,真是雪特,除了Win32 環境有微軟提供的 php native driver 外,Linux 上真的沒辦法了。
但我靈光忽現,我直接跑到 FreeTDS 官網看文件,終於讓我找到關鍵的ㄧ個環境變數。
這個環境變數名叫 FREETDSCONF ,這個環境變數的用意就是讓人可以指定設定檔的路徑,這麼一來,我們就不需要有管理者權限,只要自行編輯一個設定檔並且利用 PHP 的 putenv() 函數即可讓 freetds 動態載入設定檔了。接著說明作法如下 :
假設我們的程式放在 /home/pigo 好了,我們編寫一隻 test.php 及編寫自己的 freetds 設定檔叫 test.conf , 那麼 PHP 程式碼是這麼下的 :
<?php $conf_path = dirname(__FILE__) . "/test.conf"; // 定義FreeTDS設定檔的真實路徑 putenv("FREETDSCONF=$conf_path"); // 這行才是關鍵 , 設定環境變數 $server = "192.168.0.100"; // 這是假設的 SQL Server 的 IP $link = mssql_connect($server, 'sa', '1234'); if(false === $link) die("connect error"); if(false === mssql_select_db("mytestdb" , $link)) die("select db error"); $rows = mssql_query("SELECT * FROM mytable"); $row = mssql_fetch_array($rows); var_dump($row); // 把結果印出來看看 , 應該就是 UTF-8 的中文了 ?>
然後 test.conf 一樣放在同一個目錄 , 內容如下
[global]
tds version = 8.0
text size = 64512
client charset = UTF-8
這樣就好了 , 簡單了吧 , 根本不需要有管理員的權限用程式就可以解決了。
後記 :
此方式只在 CentOS 5.6 試過 , 而官方的 freetds 是 0.64 , 版本太舊不適用 , 因此要額外使用 yum 以 epel 提供的 freetds 的版本升級至 0.91 以上才有用。
大大 我想請教你一個問題 最近小弟剛學PHP 需要影片上傳的語法 可是GOOGLE了半天都找不到
是否能請大大指點一下! 謝謝!
這問題挺複雜的 , 影片上傳牽扯到很多技術
如果你只是要上傳檔案而不需要轉檔 , 那基本的 PHP 上傳方式應該到處都找的到 , 如果你需要轉檔
可以查查 ffmpeg , 利用 exec() 的方式下命令叫它轉檔
而檔案上傳可能又牽扯到檔案的大小 , 一般來說是要修改 php.ini 修改 max_post_size 及 max_upload_size 的設定才能收大檔 , 前端也要搭配一些 ajax 或 flash 技術讓使用者知道到底上傳進度到那了
又如果真的檔案大到不行超過 2G 之類的 , 可能 apache 就吃不了 , 這時候又要去找有沒有分割檔案的 flash 外掛來搭配 …
所以我才說很複雜的… 一言難盡
版大您好,這個問題insert 或是 update 時也適用嗎?
適用啊 , 我測過 ok
我正為UTF8亂碼煩惱, 版主介紹的方法正正能解決