我想在firebird sql查询中使用非ascii字符串文字。 因此,我使用了 FlameRobin 来看看它是否首先起作用: 我用了这样的东西:
SELECT NAME FROM TABLE1 WHERE NAME = 'العربية'
我也尝试过:
SELECT NAME FROM TABLE1 COLLATE UNICODE_CI_AI WHERE NAME = 'العربية'
没有成功。因为我已经使用 UTF8 字符集和 UNICODE_CI_AI 归类声明了 NAME 。
FlameRobin引发有关语法的错误,实际上它不理解:'العربية'字符串。 因此,我决定使用 Firebird Maestro 更改数据库管理工具以进行测试,该工具现在可以接受这类非ascii字符串文字,但过滤器操作不正确。
该问题如何解决?
注意:我正在使用Firebird v2.5
答案 0 :(得分:1)
请勿使用文字。不要将数据放入查询文本中,而应将其作为“参数”放在查询之外。
它具有许多好处,例如更可靠的解析,更多的类型检查,更高的安全性以及通常更快的速度(您可以准备一次查询,然后仅更改参数值就运行多次)。
如何对SQL查询中的参数进行编码取决于您在编程语言中用于连接到Firebird的库。有关示例,请参见http://bobby-tables.com/。以下是尝试使用的三种常用约定:
sqlite "no such table" error
-Firebird原生支持基于索引的参数访问SELECT NAME FROM TABLE1 WHERE NAME = ?
-BDE / Delphi风格SELECT NAME FROM TABLE1 WHERE NAME = :NAME_PARAM
-MS SQL / .Net样式我不知道Flame Robin和Maestro支持哪种口味。 IB专家使用Delphi库,因此使用#2选项。 Java编写的程序倾向于使用#1选项。
答案 1 :(得分:1)
Firebird使用连接字符集来知道如何编码字符串值。默认值为NONE
,这意味着未应用任何特定的字符集转换,并且每个工具/客户端的确切行为也有所不同,但是通常,客户端会应用系统默认的字符集在字节值和字符串之间进行转换。
从FlameRobin连接时,您需要指定连接字符集UTF8,您的查询才能正常工作
SELECT NAME FROM TABLE1 WHERE NAME = 'العربية'
如果未指定连接字符集,则将应用连接字符集NONE,结果字符串值将以平台默认编码(在Windows上不是utf8,但例如Windows-1252)解释)。
答案 2 :(得分:0)
对于ADO.NET连接,在连接字符串中包括“ Charset = UTF8 ”(默认情况下为“ NONE”)。如:
“ User = SYSDBA; Password = masterkey; Database = SampleDatabase.fdb; DataSource = localhost; Port = 3050; Dialect = 3; Charset = UTF8 ; Role =;连接寿命= 15;缓冲= true; MinPoolSize = 0; MaxPoolSize = 50;数据包大小= 8192; ServerType = 0;“