Символьные данные представлены неправильно, если кодовая страница клиентского компьютера отличается от базы данных

Оригинальная версия продукта: SQL Server
Исходный номер базы знаний: 904803

Симптомы

Рассмотрим следующий сценарий.

  • Вы используете SQL Server Management Studio для запроса символьных данных из базы данных SQL Server, которая использует тип данных, отличный от Юникода. Например, база данных SQL Server использует charтип данных , varcharили text .

  • Кодовая страница клиентского компьютера отличается от кодовой страницы базы данных. Кодовая страница связана с параметрами сортировки базы данных.

В этом сценарии символьные данные представлены неправильно.

Например, может возникнуть одна из следующих проблем:

  • Символьные данные представлены как вопросительный знак (?). Эта проблема может возникнуть, если вы вставляете или обновляете символьные данные как тип данных, отличный от Юникода, перед запросом символьных данных. Эта проблема возникает, если внести это изменение с помощью SQL Server Management Studio на клиентском компьютере с другой кодовой страницей.

  • Символьные данные представлены как поврежденные данные. Символьные данные кодовой страницы X хранятся в столбце кодовой страницы Y, отличном от Юникода. Кроме того, символьные данные не переводятся. Эта проблема возникает при запросе символьных данных с помощью SQL Server Management Studio.

    Примечание.

    При запросе символьных данных с помощью SQL Server Management Studio символьные данные отображаются правильно, если параметр Выполнять преобразование символьных данных (также известный Auto Translate как параметр). Параметр Auto Translate является параметром ConnectionString свойства поставщика Microsoft OLE DB для SQL Server и поставщика данных Microsoft платформа .NET Framework для OLE DB.

Причина

Эта проблема возникает из-за того, что символьные данные кодовой страницы X хранятся в столбце кодовой страницы Y, который не поддерживается.

В SQL Server при использовании строкового литерала типа данных, отличного от Юникода, строковый литерал преобразуется с помощью кодовой страницы базы данных по умолчанию, которая является производным от параметров сортировки базы данных. Хранение символьных данных кодовой страницы X в столбце кодовой страницы Y может привести к потере или повреждению данных.

Если символьные данные представлены как поврежденные данные, правильно представить их можно только при отключении Auto Translate параметра поставщика Microsoft OLE DB для SQL Server или поставщика данных Microsoft платформа .NET Framework для OLE DB.

Примечание.

SQL Server Management Studio использует поставщик данных Microsoft платформа .NET Framework для SQL Server для подключения к базе данных SQL Server. Этот поставщик данных не поддерживает Auto Translate параметр .

Обходной путь

Чтобы обойти эту проблему, используйте один из следующих методов:

Метод 1. Используйте тип данных Юникод вместо типа данных, отличного от Юникода

Измените столбцы на тип данных Юникода, чтобы избежать всех проблем, вызванных преобразованием кодовой страницы. Например, используйте ncharтип данных , nvarcharили ntext .

Способ 2. Использование параметров сортировки для базы данных

Если необходимо использовать тип данных, отличный от Юникода, всегда убедитесь, что кодовая страница базы данных и кодовая страница любых столбцов, отличных от Юникода, могут правильно хранить данные, отличные от Юникода. Например, если вы хотите сохранить символьные данные кодовой страницы 949 (корейский), используйте корейские параметры сортировки для базы данных. Например, используйте параметры сортировки Korean_Wansung_CI_AS для базы данных.

Способ 3. Используйте тип данных binary или varbinary

Если требуется, чтобы база данных напрямую хранила и извлекла точные байтовые значения обрабатываемых символов, не пытаясь выполнить соответствующий перевод кодовой страницы, используйте binary тип данных или varbinary .

Метод 4. Использование другого средства для хранения и извлечения данных, а также отключение параметра "Автоматический перевод"

Предупреждение

Мы не тестируем и не поддерживаем хранение символьных данных кодовой страницы X в столбце кодовой страницы Y. Эта операция может привести к лингвистически неверным результатам запроса, неправильному сопоставлению строк или упорядочению, а также непредвиденному переводу кодовой страницы (повреждение данных). Мы рекомендуем использовать один из других методов для решения этой проблемы.

При использовании поставщика Microsoft OLE DB для SQL Server для подключения к базе данных с другой кодовой страницей и попытке запросить символьные данные из столбца типа данных, отличного от Юникода, убедитесь, что непереводимые символы хранятся в базе данных.

Примечание.

В следующем примере предполагается, что кодовая страница клиентского компьютера является корейской (CP949), а кодовая страница базы данных SQL Server — на английском языке (CP1252). Заполнители в примерах кода необходимо заменить значениями, соответствующими вашей ситуации.

Чтобы обойти эту проблему, выполните следующие действия:

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

    string strsrc="가";string strsrc="가";
    string strtag=Encoding.GetEncoding(1252).GetString(Encoding.GetEncoding(949).GetBytes (strsrc));
    sql="insert into <tablename> (<column>,) values ('" + strtag + "')";
    // code for updating the database;
    
  2. Если вы хотите запросить данные, используйте поставщик Microsoft OLE DB для SQL Server или поставщик данных Microsoft платформа .NET Framework для SQL Server, чтобы подключиться к базе данных, а затем задайте Auto Translate для параметра значение False. Для выполнения этой операции используйте фрагмент кода, аналогичный следующему:

    OleDbConnection conn=new OleDbConnection("Provider=SQLOLEDB;" +
    " Initial Catalog =<yourdatabase>;"+
    "User id=<youruserid>; Password=<yourpassword>;"+
    "Auto Translate=False");
    // code for representing the character data;
    

Дополнительная информация

Чтобы воспроизвести проблему, выполните следующие действия.

  1. На клиентском компьютере с корейским (CP949) в качестве кодовой страницы по умолчанию запустите SQL Server Management Studio.

  2. Подключитесь к базе данных с английским языком (CP1252) в качестве кодовой страницы по умолчанию.

  3. Создайте таблицу в базе данных с помощью следующего запроса:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Вставьте корейский символ в базу данных с помощью следующего запроса:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. Создайте запрос на выборку для получения данных с помощью следующего запроса:

    SELECT * FROM tbTest
    

Вы получите следующие результаты. Значение в столбце A является вопросительным знаком.


A                    NA         Comment
-------------------- ---------- --------------------
?                    가          SQLServer/INSERT

Ссылки