FireDac + FireBird 的中文解碼問題 |
答題得分者是:leveon
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位!
這是一個難題(我個人認為) 後端 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 發送簡訊給我 |
|
pcplayer99
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
刚才做了一下实验。我有一个 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 發送簡訊給我 |
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 發送簡訊給我 |
|
leveon
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
文獻是寫 "棄用" http://www.destructor.de/firebird/charsets.htm ===================引 用 P.D. 文 章=================== 謝謝兩位指導, 我還真不知道 FB 可以宣告為 UTF8, 因為查看之前的文獻都是指出 UNICODE_FSS 我再使用 UTF8測試看看 |
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我目前使用的是 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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |