sql-server - length - tipos de datos sql server
¿Cuándo debemos usar NVARCHAR/NCHAR en lugar de VARCHAR/CHAR en SQL Server? (5)
Debe usar NVARCHAR cada vez que tenga que almacenar varios idiomas. Creo que debes usarlo para los idiomas asiáticos, pero no me cites.
Este es el problema si toma ruso, por ejemplo, y lo almacena en varchar, estará bien mientras defina la página de códigos correcta. Pero supongamos que usa una instalación sql en inglés predeterminada, y los caracteres rusos no se manejarán correctamente. Si usabas NVARCHAR (), se manejarían correctamente.
Editar
Ok, permítanme citar MSDN y tal vez fui específico pero no desea almacenar más de una página de códigos en una columna varcar, mientras que usted no debería
Cuando maneja datos de texto que están almacenados en los tipos de datos char, varchar, varchar (max) o text, la limitación más importante a tener en cuenta es que el sistema solo puede validar la información de una sola página de códigos. (Puede almacenar datos de varias páginas de códigos, pero esto no se recomienda). La página de códigos exacta utilizada para validar y almacenar los datos depende de la intercalación de la columna. Si no se ha definido una intercalación a nivel de columna, se utiliza la intercalación de la base de datos. Para determinar la página de códigos que se usa para una columna determinada, puede usar la función COLLATIONPROPERTY, como se muestra en los siguientes ejemplos de código:
Aquí hay algo más:
Este ejemplo ilustra el hecho de que muchas configuraciones regionales, como Georgian e Hindi, no tienen páginas de códigos, ya que son intercalaciones Unicode-only. Esas colaciones no son apropiadas para las columnas que usan el tipo de datos char, varchar o text
Así que georgiano o hindi realmente necesitan almacenarse como nvarchar. El árabe también es un problema:
Otro problema que puede encontrar es la imposibilidad de almacenar datos cuando no todos los caracteres que desea apoyar están contenidos en la página de códigos. En muchos casos, Windows considera que una página de códigos particular es la página de códigos que mejor se ajusta, lo que significa que no hay garantía de que pueda confiar en que la página de códigos maneje todo el texto; es simplemente el mejor disponible. Un ejemplo de esto es el script árabe: admite una amplia variedad de idiomas, incluidos baluchi, bereber, farsi, cachemira, kazajo, kirguiz, pashto, sindhi, uigur, urdu y más. Todos estos idiomas tienen caracteres adicionales además de los del idioma árabe tal como se define en la página de códigos de Windows 1256. Si intenta almacenar estos caracteres adicionales en una columna que no sea Unicode que tenga la intercalación árabe, los caracteres se convertirán en signos de interrogación.
Algo que debe tener en cuenta cuando utiliza Unicode, aunque puede almacenar diferentes idiomas en una sola columna, solo puede ordenar usando una sola intercalación. Hay algunos idiomas que usan caracteres latinos pero no los clasifican como otros idiomas latinos. Acentos es un buen ejemplo de esto, no puedo recordar el ejemplo, pero había un idioma de Europa del Este cuya Y no se ordenó como la Y española. Luego está el español ch que los usuarios españoles esperan clasificar después de h.
En definitiva, con todos los problemas que tiene que enfrentar cuando se trata de la internalización. En mi opinión, es más fácil usar los caracteres Unicode desde el principio, evitar las conversiones adicionales y aprovechar el éxito del espacio. De ahí mi declaración anterior.
¿Existe una regla cuando debemos usar los tipos Unicode?
He visto que la mayoría de los idiomas europeos (alemán, italiano, inglés, ...) están bien en la misma base de datos en las columnas VARCHAR.
Estoy buscando algo como:
- Si tiene chino -> use NVARCHAR
- Si tiene alemán y árabe -> use NVARCHAR
¿Qué pasa con la recopilación del servidor / base de datos?
No quiero usar siempre NVARCHAR como se sugiere aquí ¿Cuáles son las principales diferencias de rendimiento entre los tipos de datos de servidor SQL varchar y nvarchar?
Griego necesitaría UTF-8 en N tipos de columna: αβγ;)
Josh dice: "... Algo que hay que tener en cuenta cuando usas Unicode, aunque puedes almacenar diferentes idiomas en una sola columna, solo puedes ordenar usando una única intercalación. Hay algunos idiomas que usan caracteres latinos pero no se ordenan como otros idiomas latinos. Acentos es un buen ejemplo de esto, no puedo recordar el ejemplo, pero había un idioma de Europa del Este cuya Y no se ordenó como la Y española. Luego está el español ch que los usuarios españoles esperan ser ordenados después de h ".
Soy un hablante nativo de español y "ch" no es una letra sino dos "c" y "h" y el alfabeto español es como: abcdefghijklmn ñ opqrstuvwxyz No esperamos "ch" después de "h" sino "i" El alfabeto es el mismo que en inglés, excepto el ñ o en HTML "& ntilde;"
Alex
La verdadera razón por la que desea usar NVARCHAR es cuando tiene diferentes idiomas en la misma columna, necesita direccionar las columnas en T-SQL sin decodificar, quiere poder ver los datos "nativamente" en SSMS, o si desea para estandarizar en Unicode.
Si trata la base de datos como almacenamiento mudo, es perfectamente posible almacenar cadenas anchas y diferentes codificaciones (incluso de longitud variable) en VARCHAR (por ejemplo, UTF-8). El problema surge cuando intenta codificar y decodificar, especialmente si la página de códigos es diferente para filas diferentes. También significa que SQL Server no podrá tratar los datos fácilmente con el fin de realizar consultas dentro de T-SQL en columnas codificadas (potencialmente variables).
El uso de NVARCHAR evita todo esto.
Recomendaría NVARCHAR para cualquier columna en la que los datos ingresados por el usuario sean relativamente sin restricciones.
Recomendaría VARCHAR para cualquier columna que sea una clave natural (como una matrícula de un vehículo, SSN, número de serie, etiqueta de servicio, número de orden, indicativo del aeropuerto, etc.) que normalmente está definida y restringida por un estándar o legislación o convención. También VARCHAR para el usuario ingresado, y muy restringido (como un número de teléfono) o un código (ACTIVO / CERRADO, S / N, M / F, M / S / D / W, etc.). No hay absolutamente ninguna razón para usar NVARCHAR para eso.
Entonces, para una regla simple:
VARCHAR cuando se garantiza que está restringido NVARCHAR de lo contrario
TL; DR;
Unicode - (nchar, nvarchar y ntext)
No unicode - (char, varchar y texto).
Las intercalaciones en SQL Server proporcionan reglas de clasificación, mayúsculas y minúsculas y propiedades de sensibilidad de acentuación para sus datos. Las intercalaciones que se utilizan con los tipos de datos de caracteres, como char y varchar, dictan la página de códigos y los caracteres correspondientes que se pueden representar para ese tipo de datos.
Suponiendo que está utilizando la intercalación de SQL SQL_Latin1_General_CP1_CI_AS
, la siguiente secuencia de comandos debería imprimir todos los símbolos que puede caber en VARCHAR
ya que utiliza un byte para almacenar un carácter (256 en total) si no lo ve en la lista impresa: necesita NVARCHAR
.
declare @i int = 0;
while (@i < 256)
begin
print cast(@i as varchar(3)) + '' ''+ char(@i) collate SQL_Latin1_General_CP1_CI_AS
print cast(@i as varchar(3)) + '' ''+ char(@i) collate Japanese_90_CI_AS
set @i = @i+1;
end
Si cambias la intercalación a "digamos" japonés, ¿notarás que todas las extrañas letras europeas se convirtieron en normales y algunos símbolos en ?
marcas.
Unicode es un estándar para asignar puntos de código a los caracteres. Debido a que está diseñado para cubrir todos los caracteres de todos los idiomas del mundo, no es necesario que las diferentes páginas de códigos manejen diferentes conjuntos de caracteres. Si almacena datos de caracteres que reflejan varios idiomas, siempre use los tipos de datos Unicode (nchar, nvarchar y ntext) en lugar de los tipos de datos no Unicode (char, varchar y text).
De lo contrario, tu clasificación será extraña.