如何在 firebird sql 语句中使用非 ascii 字符串文字?

How to use non-ascii character string literals in firebird sql statements?

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

从这个引用 url link: https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-appx06-charsets.html

FlameRobin 抛出有关语法的错误,它实际上不理解:'العربية' 字符串。 所以我决定用 Firebird Maestro 改变数据库管理工具来做测试,这个工具现在接受这些非 ascii 字符串文字,但它没有正确地做过滤器。

如何解决这个问题?

注意:我使用的是 firebird v2.5

不要使用文字。不要将数据放入查询文本中,将其放在查询之外,如 "parameters".

它有很多好处,比如更可靠的解析、更多类型检查、更安全并且通常更快(您可以准备一次查询,然后 运行 多次只更改参数值) .

如何在 SQL 查询中对参数进行编码取决于您在编程语言中使用的库来连接到 Firebird。有关示例,请参阅 http://bobby-tables.com/。以下是三个经常使用的约定来尝试:

  • SELECT NAME FROM TABLE1 WHERE NAME = ? -- Firebird 原生支持,基于索引访问参数
  • SELECT NAME FROM TABLE1 WHERE NAME = :NAME_PARAM -- BDE / Delphi 风格
  • SELECT NAME FROM TABLE1 WHERE NAME = @NAME_PARAM -- MS SQL / .Net 风格

我不知道 Flame Robin 和 Maestro 支持哪些风格。 IB 专家使用 Delphi 个库,因此使用 #2 选项。 Java-编写的程序倾向于使用#1 选项。

Firebird 使用连接字符集来了解需要如何对字符串值进行编码。默认值为 NONE,这意味着不应用特定的字符集转换,具体行为因 tool/client 而异,但通常客户端将应用系统默认字符集在字节值和字符串之间进行转换。

从 FlameRobin 连接时需要指定连接字符集 UTF8,您的查询才能正常工作

SELECT NAME FROM TABLE1 WHERE NAME = 'العربية'

如果您未指定连接字符集,则会应用连接字符集 NONE,因此字符串值将以平台默认编码(在 Windows不是utf8,而是例如windows-1252).

对于 ADO.NET 连接,在连接字符串中包含“Charset=UTF8”(默认情况下 "NONE")。如:

"User=SYSDBA;Password=masterkey;Database=SampleDatabase.fdb;DataSource=localhost;Port=3050;Dialect=3;Charset=UTF8;Role=;Connection lifetime=15;Pooling=true;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;"