Tengo una consulta SQL para crear la base de datos en SQLServer como se muestra 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
Si bien el resto del SQL está 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 crear la base de datos de esta manera es una práctica recomendada.
sql-server
database
tsql
collation
Trueno
fuente
fuente
SQL_Latin1_General_CI_AS
. Específicamente, CP1 me hizo preguntarme.SQL_Latin1_General_CI_AS
. Más bien, hay unLatin1_General_CI_AS
. VerSELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');
. Hay diferencias sutiles con respecto a la clasificación y la comparación entre las dos colaciones. Ver olcot.co.uk/sql-blogs/… .Tenga en cuenta que la respuesta aceptada es un poco incompleta. Sí, en el nivel más básico, Collation maneja la clasificación. PERO, las reglas de comparación definidas por la Clasificación elegida se usan en muchos lugares fuera de las consultas de los usuarios contra los datos del usuario.
Si "¿Qué hace
COLLATE SQL_Latin1_General_CP1_CI_AS
?" significa "¿Qué hace laCOLLATE
cláusula deCREATE DATABASE
hacer?", entonces:La
COLLATE {collation_name}
cláusula de laCREATE DATABASE
declaración especifica la clasificación predeterminada de la base de datos , y no el servidor; Las colaciones predeterminadas de nivel de base de datos y nivel de servidor controlan cosas diferentes.Controles de nivel de servidor (es decir, instancia) :
master
,model
,msdb
, ytempdb
.tempdb
, es la Clasificación predeterminada para las columnas de cadena en las tablas temporales (globales y locales), pero no las variables de tabla.master
, es la Clasificación utilizada para los datos de nivel de Servidor , como los nombres de la Base de datos (es decir, laname
columnasys.databases
), los nombres de inicio de sesión, etc.GOTO
etiquetasCOLLATE
falta la cláusulaControles a nivel de base de datos :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
, yNTEXT
- pero no useTEXT
oNTEXT
) cuando laCOLLATE
cláusula no se encuentra en la definición de columna. Esto va para ambosCREATE TABLE
yALTER TABLE ... ADD
declaraciones.'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 con columnas, se utilizará la Clasificación de la columna.sys.objects
, nombres de columnas (es decirsys.columns
), nombres de índice (es decirsys.indexes
), etc.También:
Latin1
no no media "ASCII", ya que ASCII estándar sólo cubre los valores 0 - 127, y todas las páginas de códigos (que se puede representar en SQL Server, e inclusoNVARCHAR
) Mapa esos mismos 128 valores a los mismos personajes.Si "¿Qué hace
COLLATE SQL_Latin1_General_CP1_CI_AS
?" significa "¿Qué hace esta colación en particular?", entonces:Debido a que el nombre comienza con
SQL_
, esta es una intercalación de SQL Server, no una intercalación de Windows. Estos son definitivamente obsoletos, incluso si no están en desuso oficialmente, y son principalmente para la compatibilidad anterior a SQL Server 2000. Aunque, desafortunadamente,SQL_Latin1_General_CP1_CI_AS
es muy común debido a que es el valor predeterminado cuando se instala en un sistema operativo con el inglés de EE. UU. Como idioma. Estas colaciones deben evitarse si es posible.Las intercalaciones de Windows (aquellas con nombres que no comienzan
SQL_
) son más nuevas, más funcionales, tienen una clasificación consistente entreVARCHAR
yNVARCHAR
para los mismos valores, y se actualizan con pesos de clasificación adicionales / corregidos y asignaciones en mayúsculas / minúsculas. Estas intercalaciones tampoco tienen el posible problema de rendimiento que tienen las intercalaciones de SQL Server: Impacto en los índices al mezclar los tipos VARCHAR y NVARCHAR .Latin1_General
es la cultura / localeNCHAR
,NVARCHAR
yNTEXT
datos esto determina las reglas lingüísticas utilizadas para la clasificación y la comparación.CHAR
,VARCHAR
yTEXT
datos (columnas, literales y variables) esto determina:Latin1_General
colaciones usan la página de códigos 1252, lasHebrew
colaciones usan la página de códigos 1255, y así sucesivamente.CP{code_page}
o{version}
CP{code_page}
es la página de códigos de 8 bits que determina qué caracteres se asignan a los valores 128 a 255. Si bien hay cuatro páginas de códigos para juegos de caracteres de doble byte (DBCS) que pueden usar combinaciones de 2 bytes para crear más de 256 caracteres, estos no están disponibles para las intercalaciones de SQL Server.Para las intercalaciones de Windows :
{version}
aunque no está presente en todos los nombres de intercalación, se refiere a la versión de SQL Server en la que se introdujo la intercalación (en su mayor parte). Las intercalaciones de Windows sin número de versión en el nombre son versión80
(es decir, SQL Server 2000, ya que es la versión 8.0). No todas las versiones de SQL Server vienen con nuevas intercalaciones, por lo que hay lagunas en los números de versión. Hay algunos que son90
(para SQL Server 2005, que es la versión 9.0), la mayoría son100
(para SQL Server 2008, versión 10.0), y un conjunto pequeño tiene140
(para SQL Server 2017, versión 14.0).Dije "en su mayor parte" porque las intercalaciones que terminan en
_SC
se introdujeron en SQL Server 2012 (versión 11.0), pero los datos subyacentes no eran nuevos, simplemente agregaron soporte para caracteres suplementarios para las funciones integradas. Entonces, esas terminaciones existen para la versión90
y las100
intercalaciones, pero solo comienzan en SQL Server 2012.CS
= sensible a mayúsculas oCI
minúsculasAS
= sensible alAI
acento o = insensible al acentoKS
= Kana sensible al tipo o faltante = Kana insensible al tipoWS
= sensible al ancho o faltante = insensible al anchoVSS
= selector de variación sensible (solo disponible en las colaciones de la versión 140) o falta = selector de variación insensibleOpcional última pieza:
_SC
al final significa "Soporte complementario de caracteres". El "soporte" solo afecta la forma en que las funciones integradas interpretan los pares sustitutos (que es cómo se codifican los caracteres suplementarios en UTF-16). Sin_SC
al final (o_140_
en el medio), las funciones integradas no ven un solo carácter suplementario, sino que ven dos puntos de código sin sentido que forman el par sustituto. Este final se puede agregar a cualquier intercalación no binaria, versión 90 o 100._BIN
o_BIN2
al final significa clasificación y comparación "binarias". Los datos aún se almacenan igual, pero no hay reglas lingüísticas. Este final nunca se combina con ninguna de las 5 sensibilidades o_SC
._BIN
es el estilo más antiguo y_BIN2
es el estilo más nuevo y preciso. Si usa SQL Server 2005 o más reciente, use_BIN2
. Para obtener detalles sobre las diferencias entre_BIN
y_BIN2
, consulte: Diferencias entre las diversas colaciones binarias (Culturas, versiones y BIN vs BIN2) ._UTF8
es una nueva opción a partir de SQL Server 2019. Es una codificación de 8 bits que permite almacenar datos UnicodeVARCHAR
yCHAR
tipos de datos (pero no elTEXT
tipo de datos obsoleto ). Esta opción solo se puede usar en intercalaciones que admiten caracteres suplementarios (es decir, intercalaciones de la versión 90 o 100 con_SC
su nombre y colaciones de la versión 140). También hay una sola_UTF8
colación binaria (_BIN2
, no_BIN
).TENGA EN CUENTA: UTF-8 fue diseñado / creado para ser compatible con entornos / código que están configurados para codificaciones de 8 bits pero que desean admitir Unicode. Aunque hay algunos escenarios en los que UTF-8 puede proporcionar hasta un 50% de ahorro de espacio en comparación
NVARCHAR
, eso es un efecto secundario y tiene un costo de un ligero impacto en el rendimiento en muchas / la mayoría de las operaciones. Si necesita esto por compatibilidad, entonces el costo es aceptable. Si quieres esto para ahorrar espacio, tienes una mejor prueba y PRUEBA DE NUEVO. Las pruebas incluyen toda la funcionalidad y más que unas pocas filas de datos. Tenga en cuenta que las intercalaciones UTF-8 funcionan mejor cuando TODAS las columnas, y la base de datos en sí, están utilizandoVARCHAR
datos (columnas, variables, literales de cadena) con un_UTF8
colación. Este es el estado natural para cualquiera que use esto por compatibilidad, pero no para aquellos que esperan usarlo para ahorrar espacio. Tenga cuidado al mezclar datos VARCHAR usando una_UTF8
intercalación conVARCHAR
datos que usan no_UTF8
colaciones oNVARCHAR
datos, ya que puede experimentar un comportamiento extraño / pérdida de datos. Para obtener más detalles sobre las nuevas intercalaciones UTF-8, consulte: Soporte nativo de UTF-8 en SQL Server 2019: ¿Salvador o falso profeta?fuente
COLLATE
cláusulaCREATE DATABASE
. Dijiste una de varias cosas que hace. ¿Por qué supone que el OP solo quiere saber el 10% de la respuesta? Si se presenta toda la información, cada persona puede decidir cuánto tomar. Pero si solo se da alguna información, entonces se tomó la decisión por ellos. Elijo proporcionar tanta información como sea posible porque la mayor parte no se conoce bien. (continuación)El CP1 significa 'Página de códigos 1', técnicamente esto se traduce en la página de códigos 1252
fuente
La palabra clave COLLATE especifica qué tipo de juego 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 acento ( AS )
Puedes consultar esta documentación
fuente
Esto especifica la clasificación predeterminada para la base de datos. Cada campo de texto que cree en las tablas de la base de datos utilizará esa intercalación, a menos que especifique una diferente.
Una base de datos siempre tiene una clasificación predeterminada. Si no especifica ninguno, se utiliza la clasificación predeterminada de la instancia de SQL Server.
El nombre de la clasificación que utiliza muestra que utiliza la página de códigos Latin1 1, no distingue entre mayúsculas y minúsculas (CI) y acento (AS). Esta clasificación se usa en los EE. UU., Por lo que contendrá reglas de clasificación que se usan en los EE. UU.
La clasificació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.
fuente
not
especificar una intercalación, aunque puede aceptar el valor predeterminado) incorrecto (también se utiliza para datos Unicode)Latin1_General_CI_AS
. Ahora lo leí mal porque casi esperaba que la declaración fuera sobre la recopilación del SERVIDOR, lo que requiere la aceptación del valor predeterminado en la interfaz de usuario. Para el segundo punto, parece implicar que la intercalación no se usa para ordenar datos unicode (aunque cambie desorting
astoring
en las últimas 2 oraciones). Los datos de texto Unicode también obedecen a intercalaciones.