Recientemente tuvimos un problema con la codificación relacionada con un campo que se almacena como varchar (120) en SQL Server. En SSMS, el varchar aparece como:
"¿Quién mató a JonBen?"
Sin embargo, cuando se lleva a Python, aparece como:
He investigado esto desde el lado de Python, y no pasa nada extraño. Mi teoría es que el varchar en SQL Server está aceptando caracteres UTF-8 que se muestran de manera diferente en python que SSMS. No estoy muy familiarizado con la codificación en SQL Server. ¿Puede alguien decirme lo siguiente?
- ¿Hay alguna manera en SSMS para ver la codificación de varchar? Por ejemplo, vea \ x82 en lugar de mostrar la coma como es actualmente de SSMS?
- Estamos usando SQL Server 2008. ¿Hay alguna forma de cambiar la codificación de los caracteres UTF-8 a caracteres ASCII sin usar herramientas de importación / exportación o volcar en un archivo plano? Es decir, ¿puedo hacer esta conversión a través de una consulta?
- ¿Hay alguna manera de identificar mediante programación los registros problemáticos a través de una consulta (la problemática se define como caracteres UTF-8 que no son compatibles a través de ASCII)?
¡Gracias de antemano!
Usando sp_help N'table_name';
encontré que la intercalación de esta VARCHAR
columna es: SQL_Latin1_General_CP1_CI_AS
.
VARCHAR
usando esa columna?sp_help N'table_name';
. Mire la columna basada en "nombre" y luego mire la columna "collation_name".Respuestas:
SQL Server no almacena UTF-8 bajo ninguna circunstancia. Obtiene UTF-16 Little Endian (LE) a través de
NVARCHAR
(incluyendoNCHAR
yNTEXT
, pero nunca usaNTEXT
) yXML
, o alguna codificación de 8 bits, basada en una página de códigos, a través deVARCHAR
(incluyendoCHAR
yTEXT
, pero nunca usaTEXT
) .El problema aquí es que su código está traduciendo mal ese carácter 0x82, pensando que es UTF-8, pero no lo es. No hay un "carácter" UTF-8 que tenga un valor de 0x82, por lo que se obtiene el símbolo "desconocido" / reemplazo de " ". Consulte la siguiente tabla UTF-8 que muestra que no hay caracteres para un solo byte de 0x82:
Tabla de codificación UTF-8
Según lo establecido por el OP, la clasificación de la columna en cuestión es
SQL_Latin1_General_CP1_CI_AS
, lo que significa que la codificación de 8 bits está utilizando la página de códigos 1252, que es Windows Latin 1 (ANSI) . Y verificar el valor del gráfico (desplazarse hacia abajo hasta el gráfico inferior, ya que tiene los nombres de los caracteres) 0x82 (busque "82" en la columna "Punto de código") es, de hecho, la marca de comillas baja-9 que ve en SSMS. Ese personaje, en UTF-8, es una secuencia de 3 bytes:E2 80 9A
.Lo que todo esto significa es: su código de Python necesita establecer la codificación del cliente para la conexión de SQL Server a la página de códigos 1252, o debe cambiar / convertir la codificación de la cadena devuelta de la página de códigos 1252 a UTF-8.
Por supuesto, si esto se muestra en una página web, entonces podría cambiar el juego de caracteres declarado de la página
Windows-1252
, pero eso podría interferir con otros caracteres en la página si ya hay caracteres UTF-8.fuente