Correctamente no puede traducir caracteres datos desde un cliente a un servidor mediante el controlador ODBC de SQL Server si la página de códigos cliente difiere de la página de código de servidor

Seleccione idioma Seleccione idioma
Id. de artículo: 234748 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Al utilizar el MDAC 2.1 o una versión posterior del controlador ODBC de SQL Server (versión 3.70.0623 o posterior) o el proveedor OLEDB (versión 7.01.0623 o posterior), en algunas circunstancias puede experimentar traducción de datos de caracteres desde la página de código del cliente a la página de código de servidor, incluso cuando Autotranslation está deshabilitado para la conexión.

Causa

Autotranslation no es el único mecanismo que puede producir la conversión de páginas de código. El controlador ODBC de SQL Server 7.0 y el proveedor OLEDB introducen un nuevo comportamiento al conectarse a MSDE 1.0, SQL Server 7.0 o versiones posteriores de ambos. Todas las instrucciones SQL enviadas como un evento de lenguaje se convierten a Unicode en el cliente antes de enviarse al servidor. El efecto final es similar a un Autotranslation de los todos los datos que fluyen desde el cliente al servidor mediante un evento de lenguaje, independientemente de la configuración de Autotranslation actual para la conexión. No introducirá dificultades excepto al intentar almacenar datos no convierte caracteres de una página de códigos distinta de la página de códigos de SQL Server.

Solución

No almacene datos de X de página de código en una página de código Y SQL Server (por ejemplo, código de página 950 datos en un servidor de código de página 1252). Aunque esto era posible en algunas circunstancias con las versiones anteriores de SQL Server, siempre ha sido no compatible. A un servidor de SQL 1252, todo pero 1252 un carácter no es datos de carácter válido. No se ordenan correctamente datos de carácter no Unicode desde una página de código diferente y en el caso de datos de doble byte (DBCS), SQL Server no reconocerá los límites de caracteres correctamente. Esto puede causar problemas importantes, como el problema descrito en el siguiente artículo en Microsoft Knowledge Base:
155723INF: Truncamiento de SQL Server de una cadena DBCS
La mejor opción para página de código de SQL Server es la página de códigos de los clientes que tienen acceso al servidor.

El servidor y el cliente que tienen páginas de códigos diferente, pero debe asegurarse de que Autotranslation está habilitado en el cliente para que una conversión correcta de datos a y desde la página de códigos ?s servidor en todos los casos.

Si el servidor debe almacenar datos de varias páginas de código, la solución compatible es almacenar los datos en columnas Unicode (NCHAR/NVARCHAR y NTEXT).

Si su situación requiere que almacenar datos de página X de código en una página de códigos Y SQL Server, de sólo dos formas para hacerlo de forma confiable:
  • Almacenar los datos en columnas de las columnas binary (BINARY o VARBINARY o IMAGE).
  • Escribir la aplicación para utilizar llamadas a procedimiento remoto (RPC) para todas las instrucciones SQL que tratan con datos de caracteres. Datos enviados a través de un evento RPC no están sujeta a esta conversión. Observe que hay nada en el nivel DSN que puede hacer para cambiar el tipo de eventos que se envían o controlador. Si envía un comando como un idioma o un evento RPC depende totalmente de la API y la sintaxis elegido por el programador cuando se escribe la aplicación.

Más información

Autotranslation (es decir, las ? realizar conversión de datos de carácter"casillas en las aplicaciones ODBC más recientes) convierte los caracteres datos desde la página de código del cliente en la página de código del servidor antes de enviar los datos al servidor, utilizando Unicode como un medio de traducción. Sin embargo, el controlador ODBC de SQL Server 3.7 también convierte todas las instrucciones SQL enviadas como un evento de lenguaje a Unicode antes de colocar en la conexión, que tiene un efecto que es similar a Autotranslation pero no se rige por la configuración de Autotranslation. En cambio, datos que fluyen desde el servidor al respeto de los clientes el indicador Autotranslation; si Autotranslation está desactivado en los datos llegan a la aplicación de cliente con el mismo carácter de carácter códigos como los datos tenidos en el servidor. De forma similar, puede deshabilitarse la traducción de datos de eventos de RPC de cliente a servidor desactivando Autotranslation. Sigue un script sencillo que muestra cómo afecta esto a sucesos de lenguaje. En este ejemplo se ejecuta desde el Analizador de consultas en un cliente de página 1252 de código conectarse a un servidor de página 437 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)
Tenga en cuenta lo siguiente sobre el ejemplo anterior:
  • A pesar de Autotranslation se desactiva durante este lote, el código de carácter 165 (yen en la página de códigos 1252) se convirtió en 157 (yen en la página de códigos 437). Esto es porque el controlador ODBC convertir la cadena SQL a Unicode antes de enviarlo la el servidor, por lo que el servidor era capaz de convertir el carácter apropiado para el almacenamiento en la página de códigos 437.
  • Cuando el cliente ejecutó un SELECT para recuperar los datos que sólo tenían ha almacenado, el carácter 157 llegado no traducir en el cliente (157 muestra como un cuadro "" en un cliente de página 1252 código). Esto es porque la conversión descrita en este artículo se aplica sólo a los datos enviados desde el cliente al servidor, no desde el servidor al cliente. Los datos no ha sido traducidos porque la configuración de Autotranslation está desactivada.

-- 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)
En este caso, activar Autotranslation no tenía efecto en la traducción del cliente al servidor (es decir, la traducción correcta misma desde código de carácter 165 al código de carácter 157 ocurrido), pero tenía un efecto en los datos recuperados desde el servidor. Tenga en cuenta que cuando la instrucción SELECT se ejecuta este tiempo (con Autotranslation en), los símbolos de yen mostrar correctamente en la aplicación de código de página 1252 porque han convertido desde código de carácter 157 al código de carácter 165 mediante el mecanismo de Autotranslation.

Cuando se verá este comportamiento (conversión de sucesos de lenguaje a Unicode en el cliente) mediante cualquier ODBC de SQL Server versión 3.70 o posterior y conexión a SQL Server 7.0 o posterior del controlador. No se producirá cuando usando controladores ODBC más antiguos, o cuando utiliza el controlador 3.7 para conectarse a SQL Server 6.5 o anterior. Además, si almacenan los datos en columnas Unicode (NCHAR/NVARCHAR y NTEXT) la conversión no será un problema.
Para obtener más información acerca de cómo se representan datos de caracteres en SQL Server 2005, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
904803Datos de caracteres se representan incorrectamente cuando la página de códigos del equipo cliente difiere de la página de código de la base de datos en SQL Server 2005

Propiedades

Id. de artículo: 234748 - Última revisión: jueves, 22 de febrero de 2007 - Versión: 4.3
La información de este artículo se refiere 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
Palabras clave: 
kbmt kbprb KB234748 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 234748

Enviar comentarios

 

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