我的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
答案 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(),