Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

Hace unos días me preguntaban al respecto: Collation en SQL Server, ¿Es importante? o ¿Cuán importante es?, bueno, después de haberle explicado de manera general decidí compartir algo más con todo aquel interesadoa través de este post. El collation (intercalación) es una propiedad que gobierna/define los estilos de ordenación, comparación de texto y la forma como se almacena y leen los datos de las páginas. El collation que se debe elegir tiene que soportar la configuración de idioma del sistema Windows, y en esta elección ayuda bastante el programa de instalación de SQL Server, pues durante el proceso recomienda el collation adecuado y compatible al sistema windows. El estandard para sistemas en español e inglés recomendado es SQL_Latin1_General*, y siendo más específico el más usado es SQL_Latin1_General_CP1_CI_AS (proporciona compatibilidad con versiones anteriores). De esta propiedad depende muchos resultados de consultas pues define el patrón de bits para cada caracter posible de representar de acuerdo a los páginas de códigos que soporte. Por lo tanto, póngale bastante atención, aunque parezca insignificante para la mayoría de personas, una inadecuada configuración de este tipo puede impactar bastante, causar conflictos de resolución de intercalaciones y hasta podría dejarle sin servicio. 

El collation puede configurarse/ajustarse a varios niveles tanto servidor, base de datos, columnas, y expresiones. A nivel de servidor puede configurarse durante la instalación ó reconfigurarse fácilmente con una o dos líneas de código usando la consola cmd. Para lo demás podemos usar simple T-SQL.  Ahora bien existen tipos de collations: collations  de SQL Server, Windows Collations, Collations binarios. Si el nombre (o etiqueta) del collation empieza con “SQL” entonces estamos hablando de una intercalación de SQL Server, si tiene sufijo _BIN ó _BIN2 será una intercalación Binaria, en caso contrario será una intercalación windows. Más información al respecto usted puede leer lo siguiente: http://msdn.microsoft.com/es-es/library/ms143515.aspx  y tambien sería bueno que revise las directrices para utilizar intercalaciones BIN y BIN2

En este mundo es posible que usted desee reconfigurar el collation instalado a nivel de servidor ya sea por equivocación o simplemente estandarización, para tal fin, primero verificar el collation instalado a nivel de servidor SELECT SERVERPROPERTY('collation') o dándole un click derecho en el nodo a nivel de server, pestaña General, item “Server Collation”.  Es importante enfatizar que el collation instalado a nivel de servidor es heredado para todas las bases de datos del sistema, entre ellas las bases de datos model. El collation para cualquier nueva base de datos que se vaya a crear será heredada de la base de datos model (a menos que se indique otro explicitamente) y no del collation a nivel de servidor como lo he leído y escuchado en varios lugares. En fin… sigamos. Sírvase de los siguientes contenidos para reconfigurar su server.

Debo dejar bastante claro que este proceso implica prácticamente actividades de reinicios automáticos del servidor, recreación de las bases de datos del sistema, y detachar del servidor todas las bases de datos de usuario. Por lo tanto, luego de terminar, usted tendrá que atacharlas nuevamente, tome sus precauciones!. Es posible que requiera verificar el collation de alguna base de datos, es sencillo: SELECT DATABASEPROPERTYEX('DBInventory', 'Collation'); Si la propiedad AUTO_CLOSE de la base de datos está configurada en TRUE y no existen alguna conexion abierta entonces la consulta anterior le devolverá NULL. Para solucionar el tema usted debe iniciar la base de datos o abrir una conexión, una forma práctica es:

                USE DBInventory
                GO
                SELECT DATABASEPROPERTYEX('DBInventory', 'Collation');

Una vez más AUTO_CLOSE se hace presente con sus cositas, está propiedad es bastante especial anda por donde no se le llama. En este post no hablaremos más de él, por ahora continuemos. Para listar los collations para todas las bases del servidor puede usar:

Para SQL Server 2000/2005/2008:              SELECT [name], DATABASEPROPERTYEX( [name],  'Collation') AS collation FROM sysdatabases 
Para SQL Server 2005/2008         :              SELECT name, collation FROM sys.databases 

Por otra parte, también se puede mantener o crear tablas con columnas cuyos collations de cada una puede ser diferente, depende de los requerimientos de negocio. Aquí un granito para que usted se guie al respecto. En este tema deseo aclarar un escenario que si hasta el momento usted no ha tenido oportunidad de trabajarlo, seguro que lo hará pronto. El caso es cuando por ejemplo, usted tiene una base de datos con objetos cuyos collations son diferentes y desea estandarizar el collation usado. ¿Qué hacer?, muchas personas aún piensan que cambiando el collation a nivel de base de datos los objetos contenidos la heredarán. Tenga mucho cuidado, la alteración del collation sólo afectará a las nuevas columnas y/o expresiones más no a las ya existenes, por lo tanto, es necesario realizar el cambio de collation para cada uno de los objetos según se requiera (el mismo concepto se aplica cuando se altera a nivel de servidor). Puede servirse de Setting and Changing the Column Collation para conseguirlo, aunque es obvio que requerirá realizar cambios en cientos o miles de columnas pues para eso puede usar o escribir lo comúnmente usado código que genera código.

Quiero prevenir que cuando vaya a alterar el collation de alguna columna que participa en un índice, PK, check constraints, etc se disparará un error indicándole la dependencia. Para solucionar esto se debe eliminar el índice ó PK, efectuar el cambio de collation, luego recrear lo dropeado. Este caso generalmente lo he experimentando en proyectos de migraciones durante procesos de estandarizaciones de collations, es importante ser detalloso y precavido al manipular cosas a este nivel.

En realidad es muy interesante todo tema relacionado al manejo y estandarización de collations, selección de collations, escenarios diversos y ricos donde se aprende bastante, especialmente cuando deseamos integrar sistemas multi idiomas, o cuando un equipo de desarrollo desea desarrollar sistemas orientados a mercados globales, es asi que Microsoft sigue mejorando las versiones y en SQL Server 2008 se han incorporado 80 nuevas intercalaciones ideales para trabajar sobre Windows Server 2008. También otros collations quedan obsoletos y de deprecian. Más información de estas novedades las puedes revisar en Working with the New SQL Server 2008 Collations and Earlier Versions of the Native Data Provider. Excelente, espero más adelante compartir experiencias más específicas con los que lio en el dia a dia, y su manejo con datos unicode y no unicode. Por ahora, espero que sea suficiente y les sirva.

PercyReyes,

Published 29/12/2009 10:28 por Percy Reyes

Comentarios

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

Percy Muy bueno el post, yo nunca reonfiguraria un collation, lo mejor siempre es reinstalar por lo general :(

Saturday, January 02, 2010 1:02 AM by Maxi Accotto

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

@Maxi:

bueno, yo en muchas oportunidades si he tenido que reconfigurarlo, pero tienes razon, lo más seguro es reinstalar,  pero ambas actividades es casi lo mismo, por debajo te reinstalan todo, reinicializan toda la configuración de SQL Server.

Gracias por el comentario, saludos.

Saturday, January 02, 2010 5:21 PM by Percy Reyes

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

Hola, bueno me parece interesante tu nota sobre collations, el comentario sobre reinstalar o configurar cual es la mejor opcion.

Bueno estoy aprendiendo MS SQL SERVER!!!!

Y quiero aprender mas con blog

Wednesday, January 06, 2010 5:30 PM by Miguel Angel

# Collations en SQL Server, ??Es importante?, ??Cu??n importante es? | DbRunas

PingBack desde  Collations en SQL Server, ??Es importante?, ??Cu??n importante es? | DbRunas

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

@Miguel Angel:

->Recoconfigurar el collation a nivel de servidor es más riesgoso pero si funciona si lo realizas con cuidado, no es tan complicado.

->Reinstalar es lo más sencillo, toma más tiempo, y el riesgo es menor.

Ambos métodos tienen los mismos resultados: Se configurará el server con otro collation y el servidor estará vació, tienes que volver a implementar todo desde cero (bases de datos, replicaciones, creación de logins, etc).

Saludos,

Wednesday, January 06, 2010 9:26 PM by Percy Reyes

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

Esta todo bien cuando el servidor teiene una diferente Collation pero si se tiene el siguie caso:

Como puedo camniar una base de datos que tiene este Collation=Compatibility_42_409_30003 y las otras bases de datos estan bien solo tengo una base da fatos con este problema como modifico o elimino este Caollation

gracias

Friday, January 22, 2010 5:17 PM by Anilu

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

@Anilu:

para cambiar el collation de cualquier base de datos de usuario puede servirte esto:

USE [master]

GO

ALTER DATABASE [midb] COLLATE nuevo_collation

GO

No olvides de cambiar el collation de las objetos y expresiones existentes en dicha base de datos. El cambio de collation a nivel de bd sólo se aplicará para nuevos objetos que vayas a crear más no para los existentes, por eso es necesario que cambies el collation de las columnas, expresiones, etc.

saludos,

PercyReyes,

Friday, January 22, 2010 5:56 PM by Percy Reyes

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

Muy Buena la información me ha servido bastante.

Tuesday, February 16, 2010 12:38 AM by luis

# re: Collations en SQL Server, ¿Es importante?, ¿Cuán importante es?

muy bien explicado, casi una clase.. de collation

Monday, March 08, 2010 6:15 PM by Jhonattan

Deja tu comentario

(requerido) 
(requerido) 
(opcional)
(requerido)