Estamos pasando de SQL 2005 [La instancia y la base de datos tienen intercalación de SQL_Latin1_General_CP1_CI_AS
] a SQL 2008 [que por defecto es Latin1_General_CI_AS
].
Completé una instalación de SQL 2008 R2 y utilicé la Latin1_General_CI_AS
intercalación predeterminada , con la restauración de la base de datos aún activa SQL_Latin1_General_CP1_CI_AS
. Se produjeron los problemas exceptuados: las tablas #temp estaban dentro Latin1_General_CI_AS
mientras el db estaba dentro SQL_Latin1_General_CP1_CI_AS
y aquí es donde estoy ahora. Necesito asesoramiento sobre las trampas ahora, por favor.
En la instalación de SQL Server 2008 R2, tengo la opción de instalación para su uso 'SQL Collation, used for backwards compatibility'
en el que tengo la opción de seleccionar la misma intercalación que la base de datos 2005: SQL_Latin1_General_CP1_CI_AS
.
Esto me permitirá no tener problemas con las tablas #temp, pero ¿existen dificultades?
¿Perdería alguna funcionalidad o características de cualquier tipo al no utilizar una recopilación "actual" de SQL 2008?
- ¿Qué pasa cuando nos mudamos (por ejemplo, en 2 años) de 2008 a SQL 2012? ¿Tendré problemas entonces?
¿En algún momento me verían obligado a ir
Latin1_General_CI_AS
?Leí que algunos scripts de DBA completan las filas de bases de datos completas, y luego ejecuto el script de inserción en la base de datos con la nueva recopilación.
fuente
Respuestas:
En primer lugar, disculpas por una respuesta tan larga, ya que siento que todavía hay mucha confusión cuando la gente habla de términos como cotejo, orden de clasificación, página de códigos, etc.
De BOL :
Esto significa que la Clasificación es muy importante ya que especifica reglas sobre cómo se ordenan y comparan las cadenas de caracteres de los datos.
Nota: Más información sobre PROPIEDAD DE COLECCIÓN
Ahora, primero entendamos las diferencias ......
Ejecutando debajo de T-SQL:
Los resultados serían:
Mirando los resultados anteriores, la única diferencia es el Orden de clasificación entre las 2 intercalaciones, pero eso no es cierto, lo que puede ver por qué de la siguiente manera:
Prueba 1:
Resultados de la Prueba 1:
A partir de los resultados anteriores, podemos ver que no podemos comparar directamente los valores en columnas con diferentes intercalaciones, debe usar
COLLATE
para comparar los valores de las columnas.PRUEBA 2:
La principal diferencia es el rendimiento, como señala Erland Sommarskog en esta discusión sobre msdn .
--- Crear índices en ambas tablas
--- Ejecuta las consultas
--- Esto tendrá conversión IMPLÍCITA
--- Ejecuta las consultas
--- Esto NO tendrá conversión IMPLÍCITA
La razón para la conversión implícita es porque, tengo mi base de datos y la clasificación del servidor como
SQL_Latin1_General_CP1_CI_AS
y la tabla Table_Latin1_General_CI_AS tiene una columna Comentarios definidos comoVARCHAR(50)
con COLLATE Latin1_General_CI_AS , por lo que durante la búsqueda, SQL Server tiene que hacer una conversión IMPLICIT.Prueba 3:
Con la misma configuración, ahora compararemos las columnas varchar con los valores nvarchar para ver los cambios en los planes de ejecución.
- ejecuta la consulta
- ejecuta la consulta
Tenga en cuenta que la primera consulta puede realizar la búsqueda de índice, pero tiene que hacer la conversión implícita, mientras que la segunda realiza una exploración de índice que resulta ineficiente en términos de rendimiento cuando explora tablas grandes.
Conclusión
SQL_Latin1_General_CP1_CI_AS
es una recopilación de SQL con las reglas que le permiten ordenar los datos para unicode y no unicode son diferentes.Latin1_General_CI_AS
es una recopilación de Windows con las reglas que le permiten ordenar los datos para unicode y no unicode son los mismos.Vea mi respuesta arriba.
Todo depende de la funcionalidad / características a las que se refiera. La clasificación es el almacenamiento y la clasificación de datos.
No puedo responder! Como las cosas pueden cambiar y siempre es bueno estar en línea con la sugerencia de Microsoft, debe comprender sus datos y las trampas que mencioné anteriormente. Consulte también esto y esto conecta elementos.
Cuando desee cambiar la intercalación, estos scripts son útiles. Me he encontrado muchas veces cambiando la intercalación de bases de datos para que coincida con la intercalación del servidor y tengo algunos scripts que lo hacen bastante bien. Hazme saber si lo necesitas.
Referencias
fuente
Además de lo que @Kin detalló en su respuesta , hay algunas cosas más a tener en cuenta al cambiar la intercalación predeterminada del servidor (es decir, la instancia) (los elementos sobre la línea horizontal son directamente relevantes para las dos intercalaciones mencionadas en la Pregunta; elementos debajo de la línea horizontal son relevantes para el general):
SI LA COLECCIÓN PREDETERMINADA DE SU BASE DE DATOS NO ESTÁ CAMBIANDO, entonces el problema de rendimiento de "conversión implícita" descrito en la respuesta de @ Kin no debería ser un problema ya que los literales de cadena y las variables locales usan la Clasificación predeterminada de la Base de Datos, no la del servidor. Los únicos impactos para el escenario en el que se cambia la Clasificación de nivel de instancia pero no la Clasificación de nivel de base de datos son (ambos se describen en detalle a continuación):
Una diferencia entre estas dos intercalaciones es en cómo clasifican ciertos caracteres para los
VARCHAR
datos (esto no afecta losNVARCHAR
datos). Las intercalaciones no EBCDICSQL_
usan lo que se llama "Clasificación de cadenas" para losVARCHAR
datos, mientras que todas las demás Colaciones, e incluso losNVARCHAR
datos para lasSQL_
Colaciones no EBCDIC , usan lo que se llama "Clasificación de palabras". La diferencia es que en "Word Sort", el guión-
y el apóstrofe'
(¿y quizás algunos otros caracteres?) Tienen un peso muy bajo y se ignoran esencialmente a menos que no haya otras diferencias en las cadenas. Para ver este comportamiento en acción, ejecute lo siguiente:Devoluciones:
y:
Si bien "perderá" el comportamiento de "Clasificación de cadenas", no estoy seguro de que pueda llamarlo "característica". Es un comportamiento que se ha considerado indeseable (como lo demuestra el hecho de que no se incluyó en ninguna de las intercalaciones de Windows). Sin embargo, es una diferencia de comportamiento definida entre las dos intercalaciones (de nuevo, solo para
VARCHAR
datos que no son EBCDIC ), y es posible que tenga un código y / o expectativas del cliente basadas en el comportamiento de "Clasificación de cadenas". Esto requiere probar su código y posiblemente investigar para ver si este cambio en el comportamiento podría tener algún impacto negativo en los usuarios.Otra diferencia entre
SQL_Latin1_General_CP1_CI_AS
yLatin1_General_100_CI_AS
es la capacidad de hacer expansiones en losVARCHAR
datos (losNVARCHAR
datos ya pueden hacer esto para la mayoría de lasSQL_
colaciones), como el manejoæ
como si fueraae
:Devoluciones:
Lo único que está "perdiendo" aquí es no poder hacer estas expansiones. En términos generales, este es otro beneficio de pasar a una Clasificación de Windows. Sin embargo, al igual que con el movimiento "Clasificación de cadenas" a "Clasificación de palabras", se aplica la misma precaución: es una diferencia de comportamiento definitiva entre las dos intercalaciones (de nuevo, solo para
VARCHAR
datos), y es posible que tenga código y / o cliente expectativas basadas en no tener estas asignaciones. Esto requiere probar su código y posiblemente investigar para ver si este cambio en el comportamiento podría tener algún impacto negativo en los usuarios.(Primero observado en esta respuesta SO por @Zarepheth: ¿SQL Server SQL_Latin1_General_CP1_CI_AS se puede convertir de forma segura a Latin1_General_CI_AS? )
La intercalación a nivel de servidor se utiliza para establecer la intercalación de las bases de datos del sistema, que incluye
[model]
. La[model]
base de datos se utiliza como plantilla para crear nuevas bases de datos, que incluyen[tempdb]
cada vez que se inicia el servidor. Pero, incluso con un cambio de intercalación a nivel de servidor que cambia la intercalación[tempdb]
, hay una manera algo fácil de corregir las diferencias de intercalación entre la base de datos que está "actual" cuandoCREATE #TempTable
se ejecuta y[tempdb]
. Al crear tablas temporales, declare una intercalación utilizando laCOLLATE
cláusula y especifique una intercalación deDATABASE_DEFAULT
:Es mejor usar la versión más reciente de la recopilación deseada, si hay varias versiones disponibles. A partir de SQL Server 2005, se introdujo una serie de colaciones "90", y SQL Server 2008 introdujo una serie de colaciones "100". Puede encontrar estas intercalaciones utilizando las siguientes consultas:
Como está en SQL Server 2008 R2, debe usarlo en
Latin1_General_100_CI_AS
lugar deLatin1_General_CI_AS
.Una diferencia entre las versiones sensibles a mayúsculas y minúsculas de estas intercalaciones particulares (es decir,
SQL_Latin1_General_CP1_CS_AS
yLatin1_General_100_CS_AS
) está en el orden de las letras mayúsculas y minúsculas cuando se hace la clasificación sensible a las mayúsculas y minúsculas. Esto también afecta los rangos de clase de un solo carácter (es decir[start-end]
) que se pueden usar con elLIKE
operador y laPATINDEX
función. Las siguientes tres consultas muestran este efecto tanto para la clasificación como para el rango de caracteres .:La única forma de ordenar las mayúsculas antes de las minúsculas (para la misma letra) es usar una de las 31 intercalaciones que admiten ese comportamiento, que son las
Hungarian_Technical_*
intercalaciones y un puñado deSQL_
intercalaciones (que solo admiten este comportamiento para losVARCHAR
datos )Menos importante para este cambio en particular, pero aún así es bueno saberlo, ya que sería impactante si cambiara el servidor a una intercalación binaria o sensible a mayúsculas y minúsculas, es que la intercalación a nivel del servidor también afecta:
sysname
tipo de datosEs decir, si usted o "el programador que se fue recientemente" que aparentemente es responsable de todo el código incorrecto ;-) no tuvo cuidado con la carcasa y declaró una variable,
@SomethingID
pero luego se refirió a ella como@somethingId
más adelante, eso se rompería si pasara a un caso -colación sensible o binaria. Del mismo modo, el código que usa elsysname
tipo de datos pero se refiere a él comoSYSNAME
,SysName
o algo diferente a todas las minúsculas también se romperá si se mueve a una instancia usando una intercalación binaria o sensible a mayúsculas y minúsculas.fuente