¿Qué hace ‘COLLATE SQL_Latin1_General_CP1_CI_AS’?

Tengo una consulta SQL para crear la base de datos en SQLServer como se indica a continuación:

create database yourdb on ( name = 'yourdb_dat', filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf', size = 25mb, maxsize = 1500mb, filegrowth = 10mb ) log on ( name = 'yourdb_log', filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf', size = 7mb, maxsize = 375mb, filegrowth = 10mb ) COLLATE SQL_Latin1_General_CP1_CI_AS; go 

Funciona bien

Mientras que el rest del SQL es claro, estoy bastante confundido acerca de la funcionalidad de COLLATE SQL_Latin1_General_CP1_CI_AS .

¿Puede alguien explicarme esto? Además, me gustaría saber si la creación de la base de datos de esta manera es una mejor práctica.

Establece cómo se ordena el servidor de la base de datos. en este caso:

 SQL_Latin1_General_CP1_CI_AS 

Se divide en partes interesantes:

  1. latin1 hace que el servidor trate cadenas usando charset latin 1, básicamente ascii
  2. CP1 significa Código Página 1252
  3. Comparaciones insensibles a mayúsculas / minúsculas de modo que ‘ABC’ sería igual a ‘abc’
  4. AS acento sensible, entonces ‘ü’ no es igual a ‘u’

PD: para obtener información más detallada, asegúrese de leer la respuesta de @solomon-rutzky .

El CP1 significa ‘Código de la página 1’ – técnicamente esto se traduce en la página de códigos 1252

Tenga en cuenta que la respuesta aceptada es un poco incompleta. Sí, en el nivel más básico, la intercalación maneja la clasificación. PERO, las reglas de comparación definidas por la Clasificación elegida se utilizan en muchos lugares fuera de las consultas de los usuarios contra los datos del usuario.

La COLLATE {collation_name} de la instrucción CREATE DATABASE especifica la COLLATE {collation_name} predeterminada de la base de datos , y no el servidor; Las colaciones predeterminadas a nivel de base de datos y de nivel de servidor controlan cosas diferentes.

Controles de nivel del servidor (es decir, instancia) :

  • Colación a nivel de base de datos para bases de datos del sistema: master , model , msdb y tempdb .
  • Debido al control de la intercalación de tempdb de nivel de base de datos, es la intercalación predeterminada para las columnas de cadena en tablas temporales (globales y locales), pero no las variables de tabla.
  • Debido al control de la intercalación del nivel de DB del master , es entonces la intercalación utilizada para los datos del nivel del servidor , como los nombres de las bases de datos (es decir, la columna de name en sys.databases ), nombres de inicio de sesión, etc.
  • Manejo de nombres de parámetros / variables
  • Manejo de nombres de cursor
  • Manejo de tags GOTO
  • COLLATE predeterminada utilizada para las Bases de datos recién creadas cuando falta la cláusula COLLATE

Controles de nivel de base de datos :

  • La intercalación predeterminada se utiliza para las columnas de cadenas recién creadas ( CHAR , VARCHAR , NCHAR , NVARCHAR , TEXT y NTEXT , pero no utiliza TEXT o NTEXT ) cuando la cláusula COLLATE falta en la definición de la columna. Esto se ALTER TABLE ... ADD instrucciones CREATE TABLE y ALTER TABLE ... ADD .
  • Intercalación predeterminada utilizada para literales de cadena (es decir, 'some text' ) y variables de cadena (es decir, @StringVariable ). Esta intercalación solo se usa cuando se comparan cadenas y variables con otras cadenas y variables. Al comparar cadenas / variables a columnas, se usará la intercalación de la columna.
  • La intercalación utilizada para los metadatos a nivel de base de datos, como los nombres de los objetos (es decir, sys.objects ), los nombres de las columnas (es decir, sys.columns ), los nombres de los índices (es decir, sys.indexes ), etc.
  • La intercalación utilizada para los objetos de nivel de base de datos : tablas, columnas, índices, etc.

También:

  • Las SQL_ comienzan con SQL_ son las antiguas (y definitivamente obsoletas, aunque no oficialmente desaprobadas) de las colaciones específicas de SQL Server (creadas antes de que SQL Server pudiera hacer uso de las intercalaciones de nivel de sistema operativo).
  • Todas las demás colaciones son intercalaciones de Windows y deben ser las que se utilizan.
  • ASCII es una encoding que es de 8 bits (para uso común; técnicamente “ASCII” es de 7 bits con los caracteres 0 – 127, y “ASCII extendido” es de 8 bits con los caracteres 0 – 255)
  • Latin1 refiere la cultura / localidad que determina:
    • Página de códigos para datos CHAR , VARCHAR y TEXT (columnas, literales y variables). La página de códigos es la parte “extendida” de ASCII extendido, y controla qué caracteres se usan para los valores de 128 a 255.
    • Las reglas por las cuales los personajes son ordenados y comparados. Esto cubre los datos de VARCHAR y NVARCHAR (es decir, Unicode).

La palabra clave COLLATE especifica qué tipo de conjunto de caracteres y reglas (orden, reglas de confrontación) está utilizando para los valores de cadena.

Por ejemplo, en su caso, está utilizando reglas latinas con mayúsculas y minúsculas ( CI ) y acentos sensibles ( AS )

Puede consultar esta Documentación

Esto especifica la intercalación predeterminada para la base de datos. Cada campo de texto que cree en tablas en la base de datos usará esa intercalación, a menos que especifique una diferente.

Una base de datos siempre tiene una intercalación predeterminada. Si no especifica ninguno, se utiliza la intercalación predeterminada de la instancia de SQL Server.

El nombre de la intercalación que utiliza muestra que utiliza la página de códigos Latin1 1, no distingue mayúsculas de minúsculas (CI) y es sensible a acentos (AS). Esta intercalación se usa en EE. UU., Por lo que contendrá reglas de clasificación que se utilizan en EE. UU.

La intercalación decide cómo se comparan los valores de texto para la igualdad y la semejanza, y cómo se comparan al ordenar. La página de códigos se usa cuando se almacenan datos no unicode, por ejemplo, campos varchar.

Intereting Posts