Você não pode converter corretamente dados de caractere de um cliente para um servidor usando o driver ODBC do SQL Server se a página de código do cliente difere da página de código do servidor de

Traduções deste artigo Traduções deste artigo
ID do artigo: 234748 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sintomas

Ao usar o MDAC 2.1 ou uma versão mais recente do driver ODBC do SQL Server (versão 3.70.0623 ou posterior) ou o provedor OLE DB (versão 7.01.0623 ou posterior), em algumas circunstâncias você pode enfrentar conversão de dados de caracteres da página de código do cliente para a página de código de servidor, mesmo ao Autotranslation está desabilitado para a conexão.

Causa

Autotranslation não é o único mecanismo que pode resultar na conversão de página de código. O driver ODBC para SQL Server 7.0 e o provedor OLE DB apresentam um novo comportamento ao conectar-se ao MSDE 1.0, o SQL Server 7.0 ou versões posteriores deles. Todas as instruções SQL enviadas como um evento de idioma são convertidas para Unicode no cliente antes do envio para o servidor. O efeito final desse procedimento é semelhante a um Autotranslation de todos os dados que fluem do cliente para o servidor por meio de um evento de idioma, independentemente da configuração Autotranslation atual para a conexão. Isso não apresentará qualquer dificuldades, exceto quando tentar armazenar dados de caractere não convertido de uma página de código diferente de página de código do SQL Server.

Como Contornar

Não armazene dados de X de página de código em uma página de código S SQL Server (por exemplo, código de página 950 dados em um código de página 1252 servidor). Enquanto isso não foi possível em algumas circunstâncias com versões anteriores do SQL Server, ele sempre foi sem suporte. Para um SQL Server 1252, qualquer mas um 1252 caractere não é dados de caractere válido. Dados de caracteres não-Unicode de uma página de código diferentes não serão classificados corretamente e, no caso de dois bytes (DBCS) dados, SQL Server não reconhecerá os limites de caracteres corretamente. Isso pode causar problemas significativos, como o problema descrito no seguinte artigo na Base de dados de Conhecimento da Microsoft:
155723INF: SQL Server truncamento de uma seqüência de caracteres DBCS
A melhor opção para página de código do SQL Server é a página de código dos clientes que estarão acessando o servidor.

O servidor e cliente podem ter diferentes páginas de código, mas você deve garantir que Autotranslation é habilitado no cliente para que obtenham conversão adequada de dados para e de página de código ?s servidor em todos os casos.

Se o servidor deve armazenar dados de várias páginas de código, a solução com suporte é armazenar os dados em colunas Unicode (NCHAR/NVARCHAR/NTEXT).

Se a sua situação exige que você armazena dados de página X de código em uma página de código S SQL Server, há apenas duas maneiras para fazer isso confiável:
  • Armazene os dados em colunas de colunas binário (BINARY/VARBINARY/IMAGE).
  • Escrever seu aplicativo para usar chamadas de procedimento remoto (RPCs) para todas as instruções SQL que lidam com dados de caracteres. Dados enviados através de um evento RPC não estão sujeito a essa conversão. Observe que há nada no nível DSN que você pode fazer para alterar o tipo de eventos que está sendo enviado ou driver. Se um comando é enviado como um idioma ou RPC evento depende totalmente as APIs e sintaxe escolhido pelo programador quando o aplicativo é escrito.

Mais Informações

Autotranslation (ou seja, as ? caixas de executar a conversão para dados de caracteres"seleção em aplicativos ODBC mais recentes) converte dados de caracteres da página de código do cliente na página de código servidor antes de enviar os dados para o servidor, usando o Unicode como um meio de conversão. No entanto, o driver ODBC do SQL Server 3.7 também converte todas as instruções SQL enviadas como um evento de idioma para Unicode antes de colocá-los na conexão, que tem um efeito que é semelhante ao Autotranslation mas não é regido pela configuração Autotranslation. Por outro lado, caracteres de dados que fluem do servidor de volta para a relação de clientes sinalizador Autotranslation; se Autotranslation estiver desativado os dados chegam o aplicativo cliente com o mesmo caractere códigos como os dados tinham no servidor. Da mesma forma, a conversão de dados para eventos de cliente para servidor de RPC pode ser desabilitado desativando Autotranslation. Segue um script simples que demonstra como esse comportamento afeta eventos de idioma. Este exemplo foi executado do Query Analyzer em um cliente de página 1252 de código se conectando a um servidor 437 página de código:
-- Turn Autotranslation off here.
    USE tempdb
    GO
    CREATE TABLE t1 (c1 int, c2 char(1))
    GO
    
    -- Enter a yen character, using the keystroke ALT-0165.
    INSERT INTO t1 VALUES (1, '¥') 
    SELECT c1, c2, ASCII (c2) FROM t1
c1          c2               
        ----------- ---- ----------- 
        1               157
        
        (1 row(s) affected)
Observe o seguinte sobre o exemplo anterior:
  • Embora Autotranslation estava desligado durante este lote, o código do caractere 165 (iene na página de código 1252) foi convertido para 157 (iene na página de código 437). Isso ocorre porque o driver ODBC convertido a seqüência de caracteres SQL para Unicode antes de enviá-la do servidor, portanto, o servidor não pôde convertê-lo para o caractere apropriado para o armazenamento na página de código 437.
  • Quando o cliente executou um SELECT para recuperar dados que apenas tinham sido armazenados, o caractere 157 chegou não traduzido no cliente (157 mostra backup como uma caixa "" em um cliente de página 1252 código). Isso é porque a conversão discutida neste artigo aplica-se somente para dados enviados a partir do cliente para o servidor, não a partir do servidor para o cliente. Os dados não foi convertidos porque a configuração Autotranslation é desativado.

-- Turn Autotranslation back on before running the following batch.
    INSERT INTO t1 VALUES (2, '¥')
    SELECT c1, c2, ASCII (c2) FROM t1
c1          c2               
        ----------- ---- ----------- 
        1           ¥    157
        2           ¥    157
        
        (2 row(s) affected)
Nesse caso, ativação Autotranslation teve efeito sobre a conversão do cliente para o servidor (ou seja, a conversão correta mesma de código do caractere 165 ao código de caractere 157 aconteceu), mas tem um efeito sobre os dados recuperados do servidor. Observe que quando a instrução SELECT é executada neste momento (com Autotranslation em), os símbolos de iene exibam corretamente no aplicativo 1252 da página de código porque eles têm sido convertidos de código do caractere 157 ao código do caractere 165 pelo mecanismo de Autotranslation.

Você verá quando esse comportamento (conversão de eventos de idioma para Unicode no cliente) usando qualquer ODBC para SQL Server versão do driver 3.70 ou posterior e conectar-se ao SQL Server 7.0 ou posterior. Ela não ocorrerá quando usar drivers ODBC mais antigos, ou ao usar o driver 3.7 para se conectar ao SQL Server 6.5 ou anterior. Além disso, se você estiver armazenando os dados em colunas Unicode (NCHAR/NVARCHAR/NTEXT) a conversão não será um problema.
Para obter mais informações sobre como os dados de caracteres são representados em SQL Server 2005, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
904803Dados de caractere são representados incorretamente quando a página de código do computador cliente é diferente da página de código do banco de dados no SQL Server 2005

Propriedades

ID do artigo: 234748 - Última revisão: quinta-feira, 22 de fevereiro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft Open Database Connectivity 3.7
  • Microsoft Data Engine 1.0
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Palavras-chave: 
kbmt kbprb KB234748 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 234748

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com