2012-09-20 36 views
55

He migrado una base de datos de mysql a SQL Server (política), base de datos mysql original usando UTF8.SQL Server utf8 howto?

Ahora leo https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset que SQL Server 2008 no es compatible con utf8, ¿es esto una broma?

El servidor SQL aloja múltiples bases de datos, en su mayoría codificadas en latín. Dado que el archivo db migrado está destinado a la publicación web, quiero mantener la codificación utf8. ¿Me he perdido algo o necesito enc/dec a nivel de aplicación?

+94

+1 para "es esto una broma". ;) – deceze

+1

Merece la pena señalar que Java, JavaScript, DotNet y Windows usan UTF-16 internamente, por lo que si su sitio web va a codificarse en alguno de esos casos, está guardando una conversión a UTF16. – Ben

+1

Si sirve, puede pretender que SQL Server almacena internamente el texto como UTF-8; y el controlador lo convierte nuevamente a UTF-16 cuando lo recupera. También podría pretender que SQL Server almacena el texto como UCS-32. El formato de almacenamiento interno es un detalle de implementación irrelevante. Lo importante es que las bases de datos devuelvan datos de caracteres Unicode como UTF-16 (que coincida con su entorno de programación). –

Respuesta

13

No! No es una broma.

Echa un vistazo aquí: http://msdn.microsoft.com/en-us/library/ms186939.aspx

tipos de datos de caracteres que son fijos, ya sea de longitud, nchar, o de longitud variable, nvarchar, los datos Unicode y utilizar el Unicode UCS-2 conjunto carácter.

Y también aquí: http://en.wikipedia.org/wiki/UTF-16

La mayor UCS-2 (de 2 bytes juego de caracteres universal) es un similares codificación personaje que fue reemplazado por UTF-16 en la versión 2.0 de la Unicode estándar en julio de 1996.

+0

Ok. ¿Puede el cliente mssql traducir al mundo exterior UTF8? – Teson

+0

'mssql-client' puede ser todo. Java, .NET, C, PHP, etc ... ¿Qué significa con el cliente? – edze

+1

Cliente: extensión sqlsrv en php. Robert lo pone en un texto claro aquí: http://social.msdn.microsoft.com/Forums/en/sqldriverforphp/thread/e6e506cd-e7f8-42a2-87fb-4e19f8fa9368, evaluará y publicará los resultados. – Teson

12

UTF-8 no es un conjunto de caracteres, es una codificación. El juego de caracteres para UTF-8 es Unicode. Si desea almacenar texto Unicode, utilice el tipo de datos nvarchar.

Si la base de datos usaría UTF-8 para almacenar texto, aún no obtendría el texto como datos codificados UTF-8, lo obtendría como texto decodificado.

Puede almacenar fácilmente texto codificado en UTF-8 en la base de datos, pero luego no lo almacena como texto, lo almacena como datos binarios (varbinary).

+0

Gracias por su contribución. Hay más que aprender al respecto, mirando por ejemplo http://stackoverflow.com/questions/3951722/whats-the-difference-between-unicode-and-utf8 – Teson

+0

No puedo entender esto. "El personaje establecido para UTF8 es Unicode "?? No es utf8 más amplio que Unicode. Guardar Dauðalogn en Unicode frente a utf8 da diferentes resultados: (EF BB BF) 44 61 75 C3 B0 61 6C 6F 67 6E frente a \ u0044 \ u0061 \ u0075 \ u00f0 \ u0061 \ u006c \ u006f \ u0067 \ u006e – Teson

+2

@ user247245: UTF-8 es la codificación y Unicode es el juego de caracteres. UTF-8 es una forma de guardar Unicode. Lo que ha utilizado para representar el Unicode son códigos de escape utilizado en literales de cadenas, normalmente esa no es la forma en que representa Unicode como un archivo. UTF-32 wo uld sea la traducción más cercana directamente de Uncode a un formato de archivo, donde cada código de carácter se guarda como un número de 32 bits. – Guffa

2

Tenga en cuenta que a partir de Microsoft SQL Server 2016, UTF-8 es compatible con bcp, BULK_INSERT y OPENROWSET.

Adición 2016-12-21: SQL Server 2016 SP1 ahora habilita la compresión Unicode (y la mayoría de las demás funciones anteriores solo para empresas) para todas las versiones de MS SQL, incluidas Standard y Express. Esto no es lo mismo que el soporte UTF-8, pero produce un beneficio similar si el objetivo es la reducción del espacio en disco para los alfabetos occidentales.