2014-04-14 35 views
1

好吧,我們的數據庫是Intersystems緩存,我試圖通過php從這個表中獲取值。我設法得到了這些值,但是一些值是不完整的,並且在最後有符號。緩存ODBC字符

這是人物.. php99¥7「 \ß|

然後我試圖通過水晶報表來獲取值..沒有符號,但仍長期價值是不完整的,我看到的字段類型,它說字符串[30],所以我認爲它被限制爲30個字符。但在vb應用程序中查看時,它顯示的字符超過30個。

例子:

php = "The quick brown fox jumps overphp99¥7「\ߦ" 
crystal reports = "The quick brown fox jumps over" 
VB application = "The quick brown fox jumps over the lazy dog" 

我沒有VB的來源,所以我不能真正看到哪些SQL它的運行。

任何人都可以幫助......?

+0

您可以使用選項檢查晶體的SQL數據庫'--->顯示SQL Query' .. – Siva

+0

YEP已經嘗試過,但仍然是相同的,實際上它在水晶也是不完整的, – Cyr

+0

我很抱歉,我不作爲Vb的一部分,在晶體領域擁有專業知識 – Siva

回答

1

當直接使用caché中的全局變量時,表中列長度的約束不被驗證。 通過這種方式,可以將信息的長度超過列的最大長度。

另一方面,ODBC和可能還有水晶報告(我認爲他們在後臺使用odbc)將它們的列長度基於表的定義。

在這種情況下,簡單的解決方案是增加相關列的長度。這將使水晶報告和PHP都返回正確的價值。問題是如果解決了你的問題。也許你想要列的最大長度爲30個字符。在這種情況下,需要在直接訪問全局變量的VB應用程序中構建一個硬性檢查。

0

我也遇到過這個bug。問題是由PDO_ODBC unicode轉換引起的,我使用修補PHP源代碼修復了它。

文件:EXT/PDO_ODBC/odbc_stmt.c 更換行(#631在我的安裝)

S->cols[colno].datalen+1, &S->cols[colno].fetched_len);

S->cols[colno].datalen*2+1, &S->cols[colno].fetched_len);

我知道,此修復程序不理想,但在我的情況下效果很好。