這幾天試用了一下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
byte
[] databaseBuffer
=
this
.Charset.GetBytes(database);
改為
byte
[] databaseBuffer
=
System.Text.Encoding.Default.GetBytes(database);
這樣每次打開數據庫的時候.Net Provider會將文件名轉換成OEM字符集傳給Firebird。
點擊此處下載編譯後的.Net Provider
解决Firebird数据库在中文路径下无法打开的问题。发现.NetProvider将数据库路径错误地转换为特定字符集,导致非英文环境出现问题。通过修改.NetProvider源代码,使用默认编码转换路径解决了该问题。
1956

被折叠的 条评论
为什么被折叠?



