Descripción de almacenar datos de UTF-8 en SQL Server


Resumen


Algunas aplicaciones (especialmente los que están basados en Web) deben tratar con datos Unicode que está codificados con la codificación UTF-8. SQL Server 7.0 y SQL Server 2000 utilizan una codificación distinta de Unicode (UCS-2) y que no reconocen UTF-8 como datos de carácter válido. En este artículo se describe algunas opciones para tratar esta situación.

Más información


Datos Unicode pueden codificar de muchas maneras diferentes. UCS-2 y UTF-8 son dos formas comunes para almacenar modelos de bits que representan los caracteres Unicode. Microsoft Windows NT, SQL Server, Java, COM y el controlador ODBC de SQL Server y proveedor OLEDB todos representan internamente los datos Unicode como UCS-2.

Las opciones para utilizar SQL Server 7.0 o SQL Server 2000 como un servidor back-end para una aplicación que envía y recibe datos Unicode que está codificados como UTF-8 se incluyen:

  1. Si su aplicación utiliza páginas Active Server (ASP) y está utilizando Internet Information Server (IIS) 5.0 y Microsoft Windows 2000, puede agregar "< % Session.Codepage=65001% >" a la secuencia de comandos de servidor ASP. Esto indica a IIS que convertir todas las cadenas generadas dinámicamente (ejemplo: Response.Write) desde UCS-2, UTF-8 automáticamente antes de enviarlos al cliente.

    Si no desea habilitar las sesiones, o bien puede utilizar la directiva de servidor "< % @ CodePage = 65001% >".

    Los datos UTF-8 enviados desde el cliente al servidor a través de GET o POST también se convierten automáticamente en UCS-2. La propiedad Session.Codepage es el método recomendado para controlar los datos UTF-8 en una aplicación web. Esta configuración de página de códigos no está disponible en IIS 4.0 y Windows NT 4.0. Para obtener información adicional, consulte el artículo siguiente en Microsoft Knowledge Base:
    254313 mensaje de error: páginas Active Server Error ' ASP 0203' código no válido
  2. Traducir a y desde UCS-2 o UTF-8 como desee dentro de la aplicación. Código de ejemplo de este tipo de conversión se encuentra en el sitio del consorcio Unicode:

    Encontrará una descripción detallada del algoritmo para convertir UCS-2, UTF-8 en el documento Internet Request For Comments RFC2279.

    En Windows NT o Windows 2000, puede utilizar las funciones de Win32 MultiByteToWideChar y WideCharToMultiByte para convertir UTF-8 en UCS-2 y pasando la constante CP_UTF8 (65001) como primer parámetro a las funciones.
  3. Modifique la aplicación para utilizar UCS-2 en lugar de codificación UTF-8.
  4. Almacenar los datos reales de UTF-8 en el servidor utilizando las columnas BINARY o VARBINARY o IMAGE. Almacenar datos de UTF-8 en SQL Server significa que no puede utilizar SQL Server para ordenar o buscar intervalos de estos valores como si los datos fueran datos de carácter válido. Los tipos de operaciones en las columnas que contienen datos de UTF-8 que no devolvía los resultados esperados incluyen "ORDER BY", mayor-que ">" y menor-que "<" comparaciones y las funciones integradas de manipulación de cadena SQL Server como SUBSTRING().

    Sin embargo, las comparaciones de igualdad, funcionará siempre y cuando las cadenas comparadas sean equivalentes a nivel de byte. Tenga en cuenta que si almacena datos UTF-8 en SQL Server no debe utilizar columnas de caracteres (CHAR, NCHAR/VARCHAR etc.). UTF-8 no es datos de carácter válido para SQL Server y almacenamiento de datos de carácter no en columnas de caracteres, que corre el riesgo de encontrar problemas como los problemas descritos en los siguientes artículos de Microsoft Knowledge Base:
    155723 INF: SQL Server truncamiento de una cadena DBCS
    234748 PRB: controlador ODBC de SQL Server convierte sucesos de lenguaje a Unicode
    Si está considerando esta opción, tenga en cuenta que si alguna vez necesita tener acceso a datos UTF-8 se almacenan dentro de SQL Server desde cualquier aplicación que no sea un explorador Web (por ejemplo, desde una aplicación de ODBC no basados en Web) debe realizar una conversión de UTF-8 a UCS-2, dentro de esta aplicación como ODBC, OLE DB, COM, llamadas API Win32, VB y C funciones de manipulación de cadenas en tiempo de ejecución no funcionan con datos UTF-8. Esto mueve la carga de la traducción a una aplicación diferente.
  5. Si los requisitos no incluyen la necesidad de almacenar datos de una combinación de idiomas que no pueden satisfacerse mediante una página de código único, no debe utilizar Unicode.
Se introdujo la compatibilidad con Unicode a SQL Server a partir de SQL Server 7.0. Dado que SQL Server 6.5 no admite el almacenamiento de datos Unicode, las únicas opciones para SQL Server 6.5 se describen en los pasos 4 y 5.