Firebird连接在路径中使用非ASCII字符

时间:2017-01-10 11:14:33

标签: unicode connection firebird

我的Windows服务器设置为土耳其语区域设置。我的Firebird数据库存在于包含土耳其语字符的路径上。这就是我的连接刺痛的样子:

"user id=somename;password=somepwd;max pool size=200;min pool size=8;
   connection lifetime=120000;
   initial catalog=E:\\Açğıİîöşüûin\\Metabase\\metabase.fdb;port number=3050;
   data source=127.0.0.1;server type=Default;packet size=8192;charset=UTF8;"

我在C#中使用FirebirdClient来连接

当我尝试打开时,我得到了这个例外:

  

“文件的CreateFile(打开)\”操作期间的I / O错误   尝试“E:\A giI s in\ Metabase \ metabase.fdb \”\ r \ n   打开文件“

如果名称的土耳其语部分是ANSI,则数据库打开正常。

是否可以让FB尊重土耳其路径名称? 是否可以使用包含除ANSI字符以外的任何内容的路径名(例如西里尔字母,阿拉伯字母,UNICODE,UTF8)?

FB版本2.5.2

2 个答案:

答案 0 :(得分:2)

历史上只支持ASCII字符,并且如果与OS语言环境默认字符集相同,则使用连接字符集中的字符也会起作用(我相信有一些例外情况,特别是在2.5之前的版本中使用UTF-8) )。不幸的是,ADO.net提供程序始终使用UTF-8来发送数据库名称。

从Firebird 2.5开始,如果数据库参数缓冲区包含isc_dpb_utf8_filename选项,则可以使用UTF-8,而Firebird ado.net提供程序确实支持此扩展。因此,我假设您要么使用旧版本的Firebird ado.net提供程序,但不支持此功能,或者您使用的是Firebird 2.1或更早版本。

然而,仔细观察您使用的路径,可能会与Firebird在Windows上执行的一些路径规范化相冲突,从而使路径不区分大小写。您的代码中的路径为Açğıİîöşüûin,但错误消息报告A�giI��s��in(BTW:在我的系统中,我没有UTF替换字符并显示AçgiIîösüûin!),这表明至少已完成一些规范化:ğ - > gı - > iİ - > Iş - > s。例如,如果我将文件夹重命名为AçgiIîösüûin,即使我在C#代码中使用Açğıİîöşüûin,它也能正常工作。

这与路径规范化有关似乎可以证实,当我尝试使用路径D:\Temp\Açğıİîöşüûin\testdatabase.fdb使用Firebird 3打开Firebird 2.5数据库时,生成的有关不受支持的ODS版本的错误消息会报告路径为D:\TEMP\AÇGIIÎÖSÜÛIN\TESTDATABASE.FDB

所以看起来你需要小心使用的路径,我建议你只使用带有ASCII的路径,或者尝试使用别名(但这可能会有同样的问题)。

它可能是Firebird中的一个错误,但我不确定:Windows本身可能会执行类似的规范化,因为初始错误是在原始情况下,但是已经规范化。您应该考虑将问题发布到firebird-devel邮件列表。

答案 1 :(得分:0)

通过此WIN API函数使用DOS简称:

// Define GetShortPathName API function

[System.Runtime.InteropServices.DllImport("kernel32.dll",
 CharSet = System.Runtime.InteropServices.CharSet.Auto,
 SetLastError = true)]

static extern uint GetShortPathName(string lpszLongPath, StringBuilder shortPath, int shortPathLength);

并将数据库路径作为shortPath传递

var connectionString = new FbConnectionStringBuilder { Database = shortPath.ToString(),