全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3500
推到 Plurk!
推到 Facebook!

FireDac + FireBird 的中文解碼問題

答題得分者是:leveon
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-12-14 00:15:28 IP:118.169.xxx.xxx 未訂閱
請問各位!

這是一個難題(我個人認為)

後端 DataSnap FireBird, 以 XE7 內建的 InterBase 元件(俗稱 IBX, 如 IBDataBase IBTransaction IBQuery)
資料庫為 FireBird ,
欄位 myname varchar(20) CHARACTER SET UNICODE_FSS,
.....

前端 App, SQLConnect ClientData 連接後端資料庫
利用 Memo 把 myname 加入, 中文顯示一切正常

但如果將後端的 IBX 元件換成 FireDac (FDphysFBDriverLink FDConnect FDQuery) 來連結 FireBird 資料庫,
同樣的設定, 在前端App 利用 Memo 把 myname 加入(Memo1.Lines.Add(xxx)), 完全顯示出亂碼,
我不知道是 TMemo 的問題, 還是 FireDac 的問題,
是否有那裡參數要調整?


pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-12-14 18:31:58 IP:183.15.xxx.xxx 訂閱
FireBird -- FireDAC -- DataSetProvider --- ClientDataSet

这里,我测试过,BLOB 用 UTF8, TDBMemo 连接过去,是正常的。不会乱码。

所以,你加上一个 ClientDataSet 然后试试?
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-12-15 10:43:54 IP:120.236.xxx.xxx 訂閱
刚才做了一下实验。我有一个 Table 里面有 2 个 Field ,一个是 VarChar  ASCII 一个是 VarChar UTF8

用 FireDAC 的话:

DriverID=FB
CharacterSet=ASCII
Database=192.168.56.1:E:\XE2TEST\FIREDAC_FIREBIRD\DATA\DEVDEPARTMENT.FDB
Password=masterkey
User_Name=sysdba

如果 CharacterSet=ASCII, 则 ASCII Field 里面的中文能够 select 出来,并不会出问题。但 UTF8 Field 如果加入到 select 语句里面,Open 的时候就直接 exception 了。

如果 CharacterSet=UTF8,则 ASCII Field 里面如果没有中文,select 的时候不会出问题。如果有中文字符,则 Open 的时候也会 exception。这种情况下, UTF8 Field 里面的中文内容是可以正确获得并显示出来的。

所以,你要注意你的 FireBird DataBase 的 CharacterSet 和你的每个 Table 里面的 Field 的 CharacterSet。

leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-12-15 11:12:54 IP:111.251.xxx.xxx 訂閱

1.UNICODE_FSS 是Firebird 舊版格式 不應該再使用 應改用UTF 8
myname VARCHAR(20) CHARACTER SET UTF8 COLLATE UTF8,

2. sqlconnection 的CharacterSet 也應該要是UTF8

個人認為只要符合1,2兩點 應該就沒問題了
因為樓上已經測過了



===================引 用 pcplayer99 文 章===================
刚才做了一下实验。我有一个 Table 里面有 2 个 Field ,一个是 VarChar ASCII 一个是 VarChar UTF8

用 FireDAC 的话:

DriverID=FB
CharacterSet=ASCII
Database=192.168.56.1:E:XE2TESTFIREDAC_FIREBIRDDATADEVDEPARTMENT.FDB
Password=masterkey
User_Name=sysdba

如果 CharacterSet=ASCII, 则 ASCII Field 里面的中文能够 select 出来,并不会出问题。但 UTF8 Field 如果加入到 select 语句里面,Open 的时候就直接 exception 了。

如果 CharacterSet=UTF8,则 ASCII Field 里面如果没有中文,select 的时候不会出问题。如果有中文字符,则 Open 的时候也会 exception。这种情况下, UTF8 Field 里面的中文内容是可以正确获得并显示出来的。

所以,你要注意你的 FireBird DataBase 的 CharacterSet 和你的每个 Table 里面的 Field 的 CharacterSet。

編輯記錄
leveon 重新編輯於 2014-12-15 11:14:10, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-12-16 01:04:47 IP:118.169.xxx.xxx 未訂閱
謝謝兩位指導, 我還真不知道 FB 可以宣告為 UTF8, 因為查看之前的文獻都是指出  UNICODE_FSS
我再使用 UTF8測試看看
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-12-16 19:22:15 IP:111.251.xxx.xxx 訂閱


文獻是寫 "棄用"

http://www.destructor.de/firebird/charsets.htm


===================引 用 P.D. 文 章===================
謝謝兩位指導, 我還真不知道 FB 可以宣告為 UTF8, 因為查看之前的文獻都是指出 UNICODE_FSS
我再使用 UTF8測試看看
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-12-17 23:14:11 IP:118.169.xxx.xxx 未訂閱
我目前使用的是 FB 2.1X版, 看來是有支援 UTF8的, 
不過我拿之前開發系統的 GDB檔(由1.5X建立的, 當時並沒有指定 CHARACTER SET), 因為檔案筆數很大, 如果要用新建資料庫做轉檔, 將會是很龐大的資源,
所以我找了 SystemData 試圖去修正, 而資料庫中有 UNICODE_FSS (TYPE=3, UTF8 TYPE=4),
我比對以新建的資料庫與舊資料, 發現有三個SystemData 要改, 分別是
RDB$FIELDS
RDB$DATABASE
RDB$COLLATIONS
順利改完, 利用 IBOCONSOLE 開啟也看似沒有問題, 但當我把這個改好的資料庫由FireDAC 來帶入時, 出現 not support UTF8,
看來可能還不只這些要動, 我還得再進行多項測試
感謝 leveon pcplay99 提供的資訊
leveon
資深會員


發表:30
回覆:389
積分:303
註冊:2012-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-12-18 16:30:24 IP:111.251.xxx.xxx 訂閱
UNICODE_FSS佔3Byte ,UTTF8 則佔4Byte
SQL引擎處理必然不同
光改metadata不過是換皮不換骨,
縱使表面看起來可以
難保不會出現某些SQL指令會出現無法預期的錯誤

最好的辦法當然是 Dump之後再回存
完整的通過SQL檢查
https://code.google.com/p/fbclone/

重點只在於轉換的工具效率罷了


===================引 用 P.D. 文 章===================

我目前使用的是 FB 2.1X版, 看來是有支援 UTF8的,
不過我拿之前開發系統的 GDB檔(由1.5X建立的, 當時並沒有指定 CHARACTER SET), 因為檔案筆數很大, 如果要用新建資料庫做轉檔, 將會是很龐大的資源,
所以我找了 SystemData 試圖去修正, 而資料庫中有 UNICODE_FSS (TYPE=3, UTF8 TYPE=4),
我比對以新建的資料庫與舊資料, 發現有三個SystemData 要改, 分別是
RDB$FIELDS
RDB$DATABASE
RDB$COLLATIONS
順利改完, 利用 IBOCONSOLE 開啟也看似沒有問題, 但當我把這個改好的資料庫由FireDAC 來帶入時, 出現 not support UTF8,
看來可能還不只這些要動, 我還得再進行多項測試
感謝 leveon pcplay99 提供的資訊
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-12-22 14:47:44 IP:114.44.xxx.xxx 未訂閱
感謝 leveon 提供這麼多的資訊, 這篇應該資訊夠了, 我暫時結案, 如果還有需求請求協助, 再請leveon能再給予大力的協助, 謝謝
系統時間:2024-04-19 0:56:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!