php5撈取sybase資料庫,欄位資料型態decimal時的問題
最近有人提出一個狀況,他在php5中去撈資料庫(資料庫為 sybase)中的數字,會有問題。舉例來說,資料庫存放的內容為 71.10 ,但經由php5所寫的程式,去取得出來的數值卻是71.09999999999999。妙的是…一樣的程式放到php4的環境去執行,卻是正常的,取得71.1。
原以為他所撈取欄位的資料型態為float,才導致這狀況。但瞭解狀況後,發現該欄位的資料型態為decimal (5,2)。也就是說不應該會有這樣的情況!
php5連sybase,已經改用sybase_ct。因此,一開始認為這樣的問題,應該是sybase_ct本身的bug。其實,在sybase_ct的bug資料中也有提到這樣的狀況 - BUG #29064。不過,該問題卻是已經解決…
在後續的問題釐清中,也發現原以為sybase_ct是個獨立的extension,和之前的freetds無關。事實上,sybase_ct還是需要freetds。另外,sybase_ct會吃freetds的設定。也就是會吃freetds設定檔(freetds.conf)中[global]的設定值。
換句話說,當我們使用如下的php程式去開啟sybase連線時,sybase_ct會去吃freetds設定檔(freetds.conf)中[global]內的設定值。
然而,在freetds的設定檔(freetds.conf),預設中會有下列設定
這個tds版本代號有其含意,詳細可參考Choosing a TDS protocol version內的說明,視自己所用的資料庫採用不同的設定值。
居於上述兩點,解法就很簡單了。因為他是採用sybase,因此可以將此預設版本設定為5.0。問題就解決了。
原以為他所撈取欄位的資料型態為float,才導致這狀況。但瞭解狀況後,發現該欄位的資料型態為decimal (5,2)。也就是說不應該會有這樣的情況!
php5連sybase,已經改用sybase_ct。因此,一開始認為這樣的問題,應該是sybase_ct本身的bug。其實,在sybase_ct的bug資料中也有提到這樣的狀況 - BUG #29064。不過,該問題卻是已經解決…
在後續的問題釐清中,也發現原以為sybase_ct是個獨立的extension,和之前的freetds無關。事實上,sybase_ct還是需要freetds。另外,sybase_ct會吃freetds的設定。也就是會吃freetds設定檔(freetds.conf)中[global]的設定值。
換句話說,當我們使用如下的php程式去開啟sybase連線時,sybase_ct會去吃freetds設定檔(freetds.conf)中[global]內的設定值。
$conn = sybase_connect('123.123.123.123:5000','id','pwd','big5','test_php');
然而,在freetds的設定檔(freetds.conf),預設中會有下列設定
[global]
# TDS protocol version
tds version = 4.2
# TDS protocol version
tds version = 4.2
這個tds版本代號有其含意,詳細可參考Choosing a TDS protocol version內的說明,視自己所用的資料庫採用不同的設定值。
居於上述兩點,解法就很簡單了。因為他是採用sybase,因此可以將此預設版本設定為5.0。問題就解決了。
[global]
# TDS protocol version
tds version = 5.0
# TDS protocol version
tds version = 5.0
留言