【问题标题】:Firebird errors when using Symmetricds使用 Symmetricds 时出现 Firebird 错误
【发布时间】:2018-03-29 02:48:41
【问题描述】:

我正在使用 symmetricds 免费版来复制我的 firebird 数据库。当我通过创建新的(空白)数据库进行演示时,它运行良好。但是当我在现有的数据库(有数据)上进行配置时,发生了错误。

我使用 Firebird-2.5.5.26952_0 32bit & symmetric-server-3.9.5,操作系统是 Windows Server 2008 Enterprise。

我已经搜索了一整天,但没有找到解决这个问题的方法。任何人请帮忙。谢谢你的时间。

更新: 初始加载时,Symmetric 执行在 firebird DB 中声明 UDF 的语句:

declare external function sym_hex blob   
  returns cstring(32660) free_it 
  entry_point 'sym_hex' module_name 'sym_udf

它导致了错误,因为我现有的数据库字符集是 UNICODE_FSS,CSTRING 的最大长度是 10922。当我通过将字符集更新为 NONE 来解决问题时,它工作正常。但这不是一个安全的解决方案。仍在努力寻找更好的。

还有一件事,任何人都知道其他用于复制 Firebird 数据库的开源工具,我在 here 中尝试了很多,并且只有 Symmetric 工作。

【问题讨论】:

  • 问题跟踪器中有一个未解决的错误:symmetricds.org/issues/view.php?id=2369 :/
  • 能否将日志级别降低到 DEBUG 并获取引发异常的 sql 语句?
  • @BorisPavlović “将日志记录级别降低到调试”是什么意思?我在寻找解决方案时看到了这个问题,似乎没有人可以解决它:)
  • 请将错误、日志和代码发布为文本,而不是屏幕截图。
  • 1) 请务必将所有请求和错误以文本形式放入您的问题中。屏幕截图很难重复使用,并且会在不确定的短时间内过期和删除。 2)请将您在 cmets 中提到的其他数据也放入问题文本中。没有人喜欢阅读长长的评论墙来获取数据碎片。 3) 将此讨论与关键数据链接到您在 Symmetrics 上打开的错误报告中,否则如果 Symmetrics 团队会调查它 - 他们永远不会知道那些额外的细节。

标签: firebird firebird2.5 symmetricds


【解决方案1】:

问题似乎是 Firebird 中的一个错误,其中 CSTRING 的长度应该以字节为单位,但实际上它使用字符。您的数据库似乎将UTF8(或UNICODE_FSS)作为其默认字符集,这意味着每个字符最多可占用4 个字节(UNICODE_FSS 为3 个字节)。 CSTRING 的最大长度为 32767 字节,但如果以字符为单位计算 CSTRING,则最大值突然减少到 8191 个字符(或 32764 个字节)(或 10922 个字符,UNICODE_FSS 为 32766 个字节)。

解决此问题的方法是使用不同的默认字符集创建数据库。或者,您可以(暂时)更改默认字符集:

对于火鸟 3:

  1. 将默认字符集设置为单字节字符集(例如NONE)。 最好使用NONE 以避免意外的音译问题

    alter database set default character set NONE;
    
  2. 断开连接(重要的是,由于元数据缓存,您可能需要断开所有当前连接!)
  3. 设置 SymmetricDS 以创建 UDF
  4. 将默认字符集设置回UTF8(或UNICODE_FSS

    alter database set default character set UTF8;
    
  5. 再次断开连接

使用 Firebird 2.5 或更早版本时,您需要执行直接系统表更新(在 Firebird 3 中不再可能),使用:

第 2 步:

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'NONE'

第 4 步:

update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'UTF8'

替代方案是 SymmetricDS 将其初始化更改为

DECLARE EXTERNAL FUNCTION SYM_HEX
    BLOB
    RETURNS CSTRING(32660) CHARACTER SET NONE FREE_IT
    ENTRY_POINT 'sym_hex' MODULE_NAME 'sym_udf';

或者也许是字符集 BINARY 而不是 NONE,因为这似乎更接近 UDF 的意图。

【讨论】:

  • 看看他的cmets,马克。他声称他的新数据库没有字符集,而不是他的旧数据库。听起来很奇怪……
  • @Arioch'我错过了那条评论。但是,他们说它适用于一个新的空白数据库,而不是现有数据库,并且与这个答案和他们提到的每个字符集相匹配。
  • @Arioch'当我创建新的空白数据库进行测试时,我没有设置字符集,将其保留为默认值(无)。旧数据库是很久以前有人创建的,使用字符集UNICODE_FSS,我们的数据库有太多的unicode数据,现在我必须复制这个旧数据库:)
  • @Jacky 默认字符集仅指定添加(创建)新列时使用的字符集,而不指定显式字符集。
  • @MarkRotteveel 无论如何,感谢update RDB$DATABASE set RDB$CHARACTER_SET_NAME = 'NONE' 声明,在第 3 步停止并且工作正常。当我将 charset 更新回 UNICODE_FSS(第 4 步)时,对称停止工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多