Compartilhar via


Os dados de caracteres são representados incorretamente quando a página de código do computador cliente é diferente da página do banco de dados

Versão original do produto: SQL Server
Número original do KB: 904803

Sintomas

Considere o cenário a seguir.

  • Você usa o SQL Server Management Studio para consultar dados de caracteres de um banco de dados do SQL Server que usa um tipo de dados não Unicode. Por exemplo, o banco de dados do SQL Server usa o chartipo de dados , varchar, or text .

  • A página de código do computador cliente difere da página de código do banco de dados. A página de código está associada à ordenação do banco de dados.

Nesse cenário, os dados de caracteres são representados incorretamente.

Por exemplo, você pode enfrentar um dos seguintes problemas:

  • Os dados do caractere são representados como um ponto de interrogação (?). Você pode ver esse problema se inserir ou atualizar os dados de caractere como um tipo de dados não Unicode antes de consultar os dados de caractere. Esse problema ocorrerá se você fizer essa alteração usando o SQL Server Management Studio em um computador cliente que tenha uma página de código diferente.

  • Os dados do caractere são representados como dados corrompidos. Os dados de caractere da página de código X são armazenados em uma coluna não Unicode da página de código Y. Além disso, os dados de caractere não são traduzidos. Esse problema ocorre quando você consulta os dados de caractere usando o SQL Server Management Studio.

    Observação

    Quando você consulta os dados de caractere usando o SQL Server Management Studio, os dados de caractere são representados corretamente se a configuração Executar conversão de dados de caractere (também conhecida como parâmetro) estiver desabilitada Auto Translate . O Auto Translate parâmetro é um parâmetro da ConnectionString propriedade do Microsoft OLE DB Provider for SQL Server e do Microsoft .NET Framework Data Provider for OLE DB.

Causa

Esse problema ocorre porque os dados de caractere da página de código X são armazenados em uma coluna não Unicode da página de código Y, que não tem suporte.

No SQL Server, quando você usa um literal de cadeia de caracteres de um tipo de dados não Unicode, o literal de cadeia de caracteres é convertido usando a página de código padrão do banco de dados derivada da ordenação do banco de dados. Armazenar os dados de caracteres da página de código X em uma coluna da página de código Y pode causar perda ou corrupção de dados.

Se os dados de caractere forem representados como dados corrompidos, os dados só poderão ser representados corretamente se você desabilitar o Auto Translate parâmetro para Microsoft OLE DB Provider for SQL Server ou Microsoft .NET Framework Data Provider for OLE DB.

Observação

O SQL Server Management Studio usa o Provedor de Dados do Microsoft .NET Framework para SQL Server para se conectar ao banco de dados do SQL Server. Esse provedor de dados não dá suporte ao Auto Translate parâmetro.

Solução alternativa

Para contornar esse problema, use um dos seguintes métodos:

Método 1: Usar um tipo de dados Unicode em vez de um tipo de dados não Unicode

Altere as colunas para um tipo de dados Unicode para evitar todos os problemas causados pela conversão da página de código. Por exemplo, use o nchartipo de dados , nvarcharou ntext .

Método 2: Usar uma ordenação apropriada para o banco de dados

Se você precisar usar um tipo de dados não Unicode, sempre verifique se a página de código do banco de dados e a página de código de todas as colunas não Unicode podem armazenar os dados não Unicode corretamente. Por exemplo, se você quiser armazenar dados de caracteres da página de código 949 (coreano), use uma ordenação coreana para o banco de dados. Por exemplo, use a Korean_Wansung_CI_AS ordenação para o banco de dados.

Método 3: Use o tipo de dados "binário" ou "varbinário"

Se você quiser que o banco de dados armazene e recupere diretamente os valores exatos de bytes dos caracteres que são manipulados sem tentar executar a conversão de página de código apropriada, use o binary tipo de dados or varbinary .

Método 4: Use uma ferramenta diferente para armazenar e recuperar dados e desative o parâmetro "Tradução automática"

Aviso

Não testamos nem damos suporte ao armazenamento dos dados de caracteres da página de código X em uma coluna da página de código Y. Essa operação pode causar resultados de consulta linguisticamente incorretos, correspondência ou ordenação incorreta de cadeia de caracteres e conversão inesperada da página de código (corrupção de dados). Recomendamos que você use um dos outros métodos para contornar esse problema.

Quando você usa o Microsoft OLE DB Provider for SQL Server para se conectar a um banco de dados que tem uma página de código diferente e tenta consultar dados de caracteres de uma coluna de tipo de dados não Unicode, certifique-se de armazenar os caracteres não convertidos no banco de dados.

Observação

O exemplo a seguir pressupõe que a página de código do computador cliente seja coreana (CP949) e que a página de código do banco de dados do SQL Server seja inglesa (CP1252). Você deve substituir os espaços reservados nos exemplos de código por valores apropriados para sua situação.

Para contornar esse problema, siga estas etapas:

  1. Converta manualmente os caracteres em dados brutos e insira os dados no banco de dados usando a página de código do banco de dados. Para fazer essa operação, use um snippet de código semelhante ao seguinte:

    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. Quando quiser consultar os dados, use o Microsoft OLE DB Provider for SQL Server ou o Microsoft .NET Framework Data Provider for SQL Server para se conectar ao banco de dados e defina o Auto Translate parâmetro como False. Para fazer essa operação, use um snippet de código semelhante ao seguinte:

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

Mais informações

Para reproduzir o problema, siga estas etapas:

  1. No computador cliente que tem coreano (CP949) como a página de código padrão, inicie o SQL Server Management Studio.

  2. Conecte-se a um banco de dados que tenha inglês (CP1252) como a página de código padrão.

  3. Crie uma tabela no banco de dados usando a seguinte consulta:

    CREATE TABLE tbTest (A char(20), NA nchar(10), Comment char(20))
    
  4. Insira um caractere coreano no banco de dados usando a seguinte consulta:

    INSERT INTO tbTest (A,NA,Comment) VALUES('가',N'가','SQLServer/INSERT')
    
  5. Crie uma consulta seleção para recuperar os dados usando a seguinte consulta:

    SELECT * FROM tbTest
    

Você recebe os seguintes resultados. O valor na coluna A é um ponto de interrogação.


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

Referências