Получить строку ASCII из базы данных Firebird - PullRequest
0 голосов
/ 12 октября 2018

У меня есть база данных firebird, в которой есть несколько столбцов типа char [100] ASCII-кодировка.Теперь я хочу получить эти значения с помощью ADO.NET.В этих столбцах у меня есть некоторый текст со специальными символами, такими как «ó, ż, ć» и т. Д. Если в строке соединения указан набор символов ASCII, вместо специальных символов я получаю некоторые странные символы, например «óóABC» - это «?? ABC».Если charset в строке подключения имеет UTF 8, я получаю эту ошибку:

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

Из того, что я сейчас в Visual Studio, кодировкой по умолчанию является Unicode.Можно ли как-нибудь получить эти значения и преобразовать ASCII в Unicode?

1 Ответ

0 голосов
/ 12 октября 2018

ASCII определяет только символы для байтов 0-127 и содержит только базовые латинские az и AZ.Символы ó, ż и ć не существуют в ASCII.Для этих символов вам нужен один из 'расширенных' наборов символов ASCII (или расширенного ANSI), который является неточным термином для однобайтовых наборов символов, где байты 0-127 отображаются в ASCII и байты 128-255 отображаютсядля набора символов конкретных символов.Примеры включают ISO-8859-1 (Firebird: ISO8859_1), Windows-1252 (FB: WIN1252) и несколько десятков других.

Звучит так, как будто данные изначально были сохранены драйвером, который использовал набор символов подключения NONE, но отправлено байтов в наборе символов по умолчанию клиентской ОС.Использование набора символов подключения NONE позволяет сохранить отправленные байты как есть.Но когда символы извлекаются как ASCII драйвером Firebird.net, они будут сопоставлены?поскольку для этих байтов в ASCII не существует сопоставления.

Точно так же, когда вы пытаетесь привести к UTF8 в Firebird, 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 обычно проще, но поскольку всю базу данных необходимо скопировать в новую, может потребоваться больше времени, если потребуется исправить только несколько столбцов.

...