Автоматическое преобразование символьных данных

Символьные данные, такие, как объявляемые с помощью SQL_C_CHAR переменные, обозначаемые символами ANSI, или данные, хранимые в SQL Server и использующие типы данных char, varchar или text, могут представлять лишь ограниченное число символов. Символьные данные, в которых для обозначения одного символа требуется один байт данных, могут представлять только 256 символов. Для интерпретации значений, содержащихся в переменных SQL_C_CHAR, используются кодовые страницы ANSI (ACP) клиентского компьютера. Значения, сохраненные на сервере с использованием типов данных char, varchar или text, вычисляются с помощью кодовых страниц ANSI сервера.

Если сервер и клиент имеют одну и ту же кодовую страницу ANSI, значения, хранимые в объектах SQL_C_CHAR, char, varchar или text, интерпретируются без проблем. В случаях же, когда сервер и клиент имеют разные кодовые страницы ANSI, хранимые на клиенте данные SQL_C_CHAR могут передаваться на сервере с помощью другого символа, если эти данные размещаются к столбцах, переменных или параметрах char, varchar или text. Так, на компьютере, использующем кодовую страницу 437, символьный байт, содержащий значение 0xA5, интерпретируется как символ N, а на компьютере, где выполняется кодовая страница 1252, этот же байт интерпретируется как знак иены (?).

Символы в формате Юникода записываются с помощью двух байт данных. Все дополнительные символы включены в стандарт Юникод, поэтому все символы Юникода интерпретируются всеми компьютерами одинаково.

Функция AutoTranslate драйвера ODBC для собственного клиента SQL Server пытается свести эти проблемы к минимуму за счет перемещения символьных данных между клиентом и сервером, имеющими различные кодовые страницы. Функция AutoTranslate может быть установлена в строке соединения SQLDriverConnect, в строке конфигурации SQLConfigDataSource или при конфигурировании источников данных драйвера ODBC для собственного клиента SQL Server с помощью администратора ODBC

Когда AutoTranslate имеет значение "no", данные, перемещаемые между переменными SQL_C_CHAR на клиенте, и столбцами, переменными либо параметрами char, varchar или text в базе данных SQL Server, не подвергаются преобразованиям. Эти битовые шаблоны могут по-разному интерпретироваться на клиентском и серверном компьютерах, если данные содержат дополнительные символы и два компьютера имеют различные кодовые страницы. Данные интерпретируются единообразно, если оба компьютера используют одну и ту же кодовую страницу.

Когда AutoTranslate имеет значение "yes", драйвер ODBC для собственного клиента SQL Server использует формат Юникод для преобразования данных, перемещаемых между переменными SQL_C_CHAR на клиенте, и столбцами, переменными либо параметрами char, varchar или text в базе данных SQL Server:

  • Когда данные передаются из переменной SQL_C_CHAR на клиенте столбцу, переменной или параметру char, varchar или text в базе данных SQL Server, драйвер ODBC прежде всего преобразует данные SQL_C_CHAR в Юникод с помощью кодовой страницы ANSI клиента, а затем с помощью кодовой страницы ANSI сервера вновь преобразует эти данные в символ.

  • Когда данные из столбца, переменной или параметра char, varchar или text в базе данных SQL Server передаются переменной SQL_C_CHAR на клиенте, драйвер ODBC собственного клиента SQL Server прежде всего преобразует символ в Юникод с помощью кодовой страницы ANSI сервера, а затем с помощью кодовой страницы ANSI клиента вновь преобразует эти данные из формата Юникод в формат SQL_C_CHAR.

Поскольку все эти преобразования осуществляются драйвером собственного клиента ODBC SQL Server, выполняемым на клиенте, серверная кодовая страница ANSI должна быть одной из кодовых страниц, установленных на клиентском компьютере.

Выполнение символьных преобразований с использованием формата Юникод гарантирует корректное преобразование всех символов, существующих на обеих кодовых страницах. Но если символ имеется на одной кодовой странице и отсутствует на другой, этот символ не может быть представлен на целевой кодовой странице. Так, на кодовой странице 1252 имеется символ зарегистрированного товарного знака (®), а на кодовой странице 437 такого символа нет.

Настройка AutoTranslate не оказывает влияния на эти преобразования:

  • Перемещение данных между символьными клиентскими переменными SQL_C_CHAR и столбцами, переменными либо параметрами Юникод nchar, nvarchar или ntext в базах данных SQL Server.

  • Перемещение данных между клиентскими переменными Юникод SQL_C_WCHAR и символьными столбцами, переменными либо параметрами nchar, varchar или text в базах данных SQL Server.

Данные всегда нужно преобразовывать при переходе из символьного формата в Юникод.