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 laCOLLATEcláusula deCREATE DATABASEhacer?", entonces:La
COLLATE {collation_name}cláusula de laCREATE DATABASEdeclaració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, lanamecolumnasys.databases), los nombres de inicio de sesión, etc.GOTOetiquetasCOLLATEfalta la cláusulaControles a nivel de base de datos :
CHAR,VARCHAR,NCHAR,NVARCHAR,TEXT, yNTEXT- pero no useTEXToNTEXT) cuando laCOLLATEcláusula no se encuentra en la definición de columna. Esto va para ambosCREATE TABLEyALTER TABLE ... ADDdeclaraciones.'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:
Latin1no 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_ASes 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 entreVARCHARyNVARCHARpara 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_Generales la cultura / localeNCHAR,NVARCHARyNTEXTdatos esto determina las reglas lingüísticas utilizadas para la clasificación y la comparación.CHAR,VARCHARyTEXTdatos (columnas, literales y variables) esto determina:Latin1_Generalcolaciones usan la página de códigos 1252, lasHebrewcolaciones 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
_SCse 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ón90y las100intercalaciones, pero solo comienzan en SQL Server 2012.CS= sensible a mayúsculas oCIminúsculasAS= sensible alAIacento 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:
_SCal 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_SCal 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._BINo_BIN2al 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._BINes el estilo más antiguo y_BIN2es 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_BINy_BIN2, consulte: Diferencias entre las diversas colaciones binarias (Culturas, versiones y BIN vs BIN2) ._UTF8es una nueva opción a partir de SQL Server 2019. Es una codificación de 8 bits que permite almacenar datos UnicodeVARCHARyCHARtipos de datos (pero no elTEXTtipo 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_SCsu nombre y colaciones de la versión 140). También hay una sola_UTF8colació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 utilizandoVARCHARdatos (columnas, variables, literales de cadena) con un_UTF8colació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_UTF8intercalación conVARCHARdatos que usan no_UTF8colaciones oNVARCHARdatos, 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
COLLATEclá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
notespecificar 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 desortingastoringen las últimas 2 oraciones). Los datos de texto Unicode también obedecen a intercalaciones.