如何在Firebird SQL语句中使用非ASCII字符串文字?

时间:2019-01-17 01:47:33

标签: sql firebird firebird2.5

我想在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

通过此参考网址链接:https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-appx06-charsets.html

FlameRobin引发有关语法的错误,实际上它不理解:'العربية'字符串。 因此,我决定使用 Firebird Maestro 更改数据库管理工具以进行测试,该工具现在可以接受这类非ascii字符串文字,但过滤器操作不正确。

该问题如何解决?

注意:我正在使用Firebird v2.5

3 个答案:

答案 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;“