从Firebird数据库中获取ASCII字符串

时间:2018-10-12 13:37:06

标签: .net visual-studio encoding firebird

我有一个firebird数据库,其中包含一些类型为char [100] ASCII编码的列。现在,我想使用ADO.NET获取此值。在这些列中,我有一些带有特殊字符的文本,例如“ó,ż,ć”等。 如果在连接字符串中指定了字符集ASCII,那么我会得到一些混合字符而不是特殊字符,例如“óóABC”是“ ?? ABC”。 如果连接字符串中的字符集为UTF 8,则会出现此错误:

arithmetic exception, numeric overflow, or string truncation Cannot transliterate character between character sets

根据我现在在Visual Studio中的情况,默认编码为unicode。有什么办法可以获取这些值并将隐蔽的ASCII转换为unicode?

1 个答案:

答案 0 :(得分:3)

ASCII仅定义字节0-127的字符,并且仅包含基本的拉丁字母a-z和A-Z。字符óżć 在ASCII中不存在。对于这些字符,您需要'extended' ASCII(或扩展的ANSI)字符集之一,这对于单字节字符集是不精确的术语,其中字节0-127映射为ASCII,字节128-255映射为特定的字符集字符。示例包括ISO-8859-1(Firebird:ISO8859_1),Windows-1252(FB:WIN1252)和其他几十个。

听起来数据最初是由使用连接字符集NONE的驱动程序存储的,但是以客户端OS的默认字符集发送了字节。使用连接字符集NONE可使发送的字节按原样存储。但是,当Firebird.net驱动程序将字符检索为ASCII时,它们将被映射到?因为这些字节的ASCII码不存在映射。

类似地,当您尝试在Firebird中强制转换为UTF8时,Firebird不知道如何处理未映射的字节并引发音译错误。解决方法是先转换为NONE,然后转换为正确的字符集(并可选地转换为目标字符集)。例如

cast(cast(yourcolumn as varchar(100) character set none) as varchar(100) character set win1250)

要解决此问题,您需要知道原始字符集是什么(看看那个ż可能是Windows-1250,Firebird名称为WIN1250),并修复数据库。

这可以通过多种方式完成:

  1. 修复当前数据库中的数据,或
  2. 使用正确的字符集创建一个新数据库,并将数据从旧数据泵到新数据(必要时进行适当的强制转换)

选项1可能非常复杂,尤其是涉及到斑点时,您可能需要创建新列来复制数据并修复字符集。选项2通常更简单,但是由于需要将整个数据库复制到一个新数据库中,因此,如果只需要修复几列,则可能需要更长的时间。