這幾天試用了一下Firebird數據庫,2.0 + .Net Provider,嵌入式訪問。果然遇到了傳聞已久的“中文路徑無法訪問”問題,凡是路徑中有中文字符的數據庫一律提示打不開。
一開始懷疑是指定了 UTF8字符集的問題,因為在無法打開數據庫的提示中文件名已經被轉換成了UTF8編碼的亂碼。試著將字符集改成UTF16、UCS2、GBK、 GB_2312,結果都提示不支持。最後乾脆不指定字符集,結果反倒可以了。
感覺問題蹊蹺,研究了一下Firebird和.Net Provider的代碼,終於發現了問題的起因。原來Firebird的最底層src/jrd/os/winnt.cpp line 477 PIO_open()竟然是調用CreateFileA函數打開文件,只能接受ANSI和OEM字符(-_-!!! 21世紀都走過7年了,還不支持UNICODE)。.Net Provider的代碼更離譜,你指定什麼字符集,它就把數據庫文件名轉換成該字符集編碼傳給Firebird,在FesDatabase.cs line239 byte[] databaseBuffer = this.Charset.GetBytes(database);。這樣做,在英文環境下自然沒問題,在其他語言環境下就麻煩了,在Firebird的 maillist中還見到過Japan人抱怨不能用Japanese路徑。
解決方案倒也簡單,.Net Provider中的FesDatabase.cs line239

改為

這樣每次打開數據庫的時候.Net Provider會將文件名轉換成OEM字符集傳給Firebird。
點擊此處下載編譯後的.Net Provider