Firebird在WHERE子句中使用西里尔字母创建视图

时间:2014-02-15 12:53:22

标签: sql database firebird

在FireRobin中,我正在尝试创建一个包含西里尔字母的视图:

CREATE VIEW "CyrillicView" (PRIM)
AS 
SELECT 
  PRIM
FROM ROYALTY
WHERE 
  (ROYALTY.PRIM = 'Кириллица');

不幸的是,它会导致错误:

  

消息:isc_dsql_execute2失败

     

SQL消息:-607未为系统表定义此操作。

     

引擎代码:335544351引擎消息:元数据不成功   更新STORE RDB $ RELATIONS失败格式错误的字符串

当我用拉丁语替换西里尔字母时,一切正常。 另外,我注意到当我从上面的代码中只运行SELECT语句时 - 即使用西里尔字母也可以正常工作。

我尝试使用UTF-8字符集连接到FireBird,甚至成功创建了一个带有西里尔字母的视图。但它没用,因为当我连接“NONE”charset(右边的)时,视图根本不会返回任何行。我已经检查了视图创建代码,它看起来像这样:

CREATE VIEW CYR (PRIM)
AS 
SELECT 
  PRIM
FROM ROYALTY
WHERE 
  (ROYALTY.PRIM = 'Кириллица')

使用FireRobin连接NONE charset(右侧):

  • 可以用西里尔字母编写有效的SELECT查询
  • 无法使用西里尔字母创建视图
  • 可以创建没有西里尔字母的视图
  • 与UTF-8连接时创建的视图,包含西里尔字母,不返回任何内容

使用FIreRibon连接UTF-8字符集(错误的字符集)时:   - 可以使用西里尔字母创建视图(实际上不返回任何值)   - 具有NONE字符集的所有列在结果中都不包含值

也许有人可以建议我能在这做什么?我可以在where子句中以某种方式指定不使用我的编码吗?也许,在Firebird中有一个特殊的符号,就像我在SQL Server中可以放置Uncode字符串之类的那样:

CREATE VIEW CYR (PRIM)
AS 
SELECT 
  PRIM
FROM ROYALTY
WHERE 
  (ROYALTY.PRIM = N'Кириллица')

其他信息:

  • Firebird 2.5.2
  • 数据库字符集为无
  • 所有数据库的列'charest都是NONE

1 个答案:

答案 0 :(得分:2)

问题源于您使用NONE作为数据库默认,列和连接字符集。它本质上意味着'没有字符集,使用任何发送的字节'。对于基本的ASCII设置,这通常可以正常工作。对于其他角色,它可能会导致各种奇怪的问题。

对于您的视图定义,您可以通过将列显式地转换为带有西里尔字符的字符集(win1251),并使用字面集的字符集导入器来使其工作:

Cast(theColumn as varchar(100) character set win1251) = _win1251 '<cyrillic chars>'

最好是为数据库默认,列和连接使用显式字符集。使用显式字符集,如果可能,firebird将在字符集之间进行转换。