Correctamente não é possível converter dados de caracteres a partir de um cliente a um servidor utilizando o controlador de ODBC para SQL Server se a página de código do cliente for diferente da página de código de servidor

Traduções de Artigos Traduções de Artigos
Artigo: 234748 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sintomas

Quando utilizar o MDAC 2.1 ou versão posterior do controlador de ODBC para SQL Server (versão 3.70.0623 ou posterior) ou o fornecedor OLEDB (versão 7.01.0623 ou posterior), em algumas circunstâncias poderá detectar conversão de dados de caracteres da página de código de cliente para a página de código de servidor, mesmo quando Autotranslation está desactivada para a ligação.

Causa

Autotranslation não é o mecanismo único que pode resultar na conversão de páginas de código. O controlador de ODBC para SQL Server 7.0 e o fornecedor de OLEDB introduzir um novo comportamento ao ligar ao MSDE 1.0, SQL Server 7.0 ou versões posteriores de um. Todas as instruções de SQL enviadas como um evento de idioma são convertidas para Unicode no cliente antes de serem enviados para o servidor. O efeito final deste é semelhante a um Autotranslation de todos os dados de fluxo do cliente ao servidor através de um evento de idioma, independentemente da definição Autotranslation actual para a ligação. Isto não irá introduzir quaisquer dificuldades, excepto quando tentar armazenar dados de caracteres não convertida de uma página de códigos diferente da página de códigos do SQL Server.

Como contornar

Não armazene dados de X da página de código numa página de código Y SQL Server (por exemplo, código de página 950 dados num servidor código página 1252). Enquanto este estava possível em algumas circunstâncias com versões anteriores do SQL Server, tem sido sempre não suportado. A um SQL Server 1252, tudo mas um 1252 carácter não é dados de caracteres válida. Dados de caracteres não-Unicode de uma página de códigos diferentes não serão ordenados correctamente e, em caso de duplo byte (DBCS) dados, SQL Server não reconhece caracteres limites correctamente. Isto pode causar problemas significativos, tais como o problema descrito no seguinte artigo na base de dados de conhecimento da Microsoft:
155723INF: SQL Server truncagem de uma cadeia DBCS
A melhor opção para página de códigos do SQL Server é a página de códigos dos clientes que será possível aceder ao servidor.

O servidor e o cliente podem ter páginas de códigos diferentes mas, tem garantir que Autotranslation está activada no cliente para que obterá correcta conversão de dados para e de página de códigos ?s servidor em todos os casos.

Se o servidor têm de armazenar dados de várias páginas de código, a solução suportada é armazenar os dados nas colunas de Unicode (NCHAR/NVARCHAR/NTEXT).

Se a situação requer que armazene dados da página X de código numa página de código Y SQL Server, existem apenas duas formas de efectuar este procedimento eficazmente:
  • Armazena os dados nas colunas de colunas binário (BINARY/VARBINARY/IMAGE).
  • Escreva a sua aplicação para utilizar as chamadas de procedimento remoto (RPCs, Remote Procedure Calls) para todas as instruções de SQL que lidam com dados de caracteres. Os dados enviados através de um evento RPC não estão sujeitas a esta conversão. Tenha em atenção que existe nada ao nível DSN que pode efectuar para alterar o tipo de eventos a ser enviada ou controlador. Se um comando é enviado como um idioma ou evento RPC depende totalmente a API e a sintaxe escolhido pelo programador quando a aplicação é escrita.

Mais Informação

Autotranslation (ou seja, as ? caixas de efectuar a conversão para dados de caracteres"verificação nas aplicações de ODBC mais recentes) converte dados de caracteres da página de código do cliente a página de código do servidor antes de enviar os dados para o servidor, utilizando Unicode como um meio de conversão. No entanto, o controlador ODBC para servidor SQL 3.7 também converte todas as instruções de SQL enviadas como um evento de idioma para Unicode antes de colocar na ligação, que tem um efeito que é semelhante à Autotranslation mas não é regido pela definição Autotranslation. Por outro lado, códigos de caracteres dados fluxo a partir do servidor para o aspecto de clientes sinalizador Autotranslation; se Autotranslation estiver desactivado os dados chegam a aplicação de cliente com o mesmo carácter como dados tido no servidor. Do mesmo modo, conversão de dados de cliente para servidor RPC eventos pode ser desactivado, desactivando Autotranslation. Segue-se um script simples que demonstra como este comportamento afecta a eventos de idioma. Este exemplo foi executado a partir do analisador de consultas num cliente página 1252 código ligado a um código de página 437 servidor:
-- 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)
Tenha em atenção o seguinte sobre o exemplo anterior:
  • Apesar de Autotranslation estava desligado durante este processo, o código do carácter 165 (iene na página de códigos 1252) foi convertido para 157 (iene na página de códigos 437). Isto acontece porque o controlador ODBC converter a cadeia de SQL para Unicode antes de a enviar o servidor, para o servidor não conseguiu converter o carácter apropriado para o armazenamento na página de códigos 437.
  • Quando o cliente executou um SELECT para obter os dados que apenas tinham sido guardados, o carácter 157 chegou não convertidas no cliente (157 mostra mais como uma caixa "" num cliente código página 1252). Isto acontece porque a conversão referida neste artigo aplica-se apenas para dados enviados do cliente ao servidor, e não do servidor para o cliente. Os dados não foi traduzidos porque a definição Autotranslation é desactivado.

-- 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)
Neste caso, activar novamente Autotranslation tinha não afecta a conversão do cliente ao servidor (ou seja, a tradução correcta mesma código de carácter 165 código do carácter 157 aconteceu), mas tem um efeito sobre os dados obtidos a partir do servidor. Note que quando a instrução SELECT é executada este período de tempo (com Autotranslation no), os símbolos de iene apresentem correctamente na aplicação código página 1252 porque que tem sido convertidos do código de carácter 157 ao código do carácter 165 pelo mecanismo Autotranslation.

Poderá ver quando este comportamento (conversão de eventos de idioma para Unicode no cliente) utilizando qualquer ODBC SQL Server versão 3.70 ou posterior e ligação para o SQL Server 7.0 ou posterior. Não ocorrerá quando utilizar controladores ODBC antigos ou quando utilizar o controlador 3.7 para ligar ao SQL Server 6.5 ou anterior. Além disso, se está a armazenar os dados nas colunas de 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 no SQL Server 2005, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
904803Dados de carácter são representados incorrectamente quando a página de códigos do computador cliente difere a página de códigos da base de dados no SQL Server 2005

Propriedades

Artigo: 234748 - Última revisão: 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 2005 Server Enterprise
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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