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

标签 .net visual-studio encoding firebird

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

算术异常、数值溢出或字符串截断无法在字符集之间音译字符

我现在在 Visual Studio 中的默认编码是 unicode。有什么方法可以获取这些值并将 ASCII 转换为 unicode?

最佳答案

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 的驱动程序存储的,但以客户端操作系统的默认字符集发送字节。使用连接字符集 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 可能相当复杂,特别是如果涉及 blob,您可能需要创建新列来复制数据并修复字符集。方案 2 通常更简单,但由于需要将整个数据库复制到一个新数据库中,如果只需要修复几列,则可能需要更长的时间。

关于.net - 从 Firebird 数据库中获取 ASCII 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52780734/

相关文章:

visual-studio - 在 Windows 7 上安装 VS 2008 Team Developer

json - 在 r 中编码 JSON

java - 从Word文档复制到网页时文本发生变化

c# - 覆盖 .NET 通用列表 <MyType>.Contains(MyTypeInstance)?

.net - ASP .NET MVC 3 Controller

.net - 通用主机自动关闭

python - 使用 ECC 生成至少为 d 汉明距离的二进制字符串

c# - 具有变量名称、QueueTriggerAttribute 限制的 Azure 函数 QueueTrigger

c++ - 如何修复 pop_front 和 pop_back 函数?

c - Windows API 使用