type que online error data convertir converting almacena sql sql-server varchar varbinary

que - varbinary sql server c#



¿Cuál es la ventaja de usar varbinary sobre varchar aquí? (2)

Hace un tiempo hice una pregunta sobre la clasificación de la jerarquía / número de versión en SQL Server. ( ¿Cómo puedo ordenar una columna de ''Número de versión'' genéricamente usando una consulta de SQL Server? ).

Entre las respuestas que se enviaron se encuentra este enlace a un desafío de codificación TSQL con mucho el mismo enigma .

En la solución SQL2000, el autor demostró dos variaciones, una usando y devolviendo una varchar y la otra varbinary. El autor explica que está haciendo esto sin explicar por qué.

Entonces, mi pregunta es realmente, ¿cuáles son las principales diferencias / ventajas (si las hay) de la diferencia en el enfoque? Es decir, ¿por qué usar un varbinary en lugar de un varchar?

He omitido la publicación del código, como se resume de forma más elegante en el artículo anterior.


Creo que la expectativa es que los datos varbinary generalmente consumirán menos bytes (5) que el varchar uno (10 u 11, creo) por porción de la cadena original, y así, para un gran número de componentes, o comparaciones con Ocurre, debe ser más eficiente.

Pero le recomendaría que si estuviera buscando utilizar cualquiera de las dos soluciones, implementara ambas (son bastante cortas) y pruebe algunos perfiles en sus datos reales (y patrones de consulta), para ver si hay diferencias prácticas (I no esperaría así).

(Crafty Steal): Y como Martin señala, las comparaciones binarias serán más eficientes, ya que no involucrarán todo el código que está allí para lidiar con las colaciones. :-)


Si usamos una intercalación diferente para diferentes columnas varchar para almacenar cadenas y usar más de una de esas columnas en una consulta de SQL, entonces la consulta de SQL puede generar el error "Mezcla de intercalaciones no válida". (Por ejemplo, si queremos comparar dos cadenas de intercalación incompatibles o intentar seleccionar datos de una intercalación diferente en una columna combinada).

Pero, eso se puede arreglar si especificamos "COLLATE" en la consulta. Por ejemplo:

WHERE ''A'' COLLATE latin1_general_ci = ''A'' COLLATE latin1_general_ci

Pero, esto derrota cualquier INDEX que pueda tener.

Para protegernos contra los errores de "Mezcla inválida de colaciones", podemos usar varbinary.

varbinary utiliza menos espacio que varchar si se utiliza la intercalación de múltiples bytes para la columna varchar. (Las cadenas binarias no tienen conjuntos de caracteres ni colaciones. Las cadenas binarias no son más que una secuencia de valores de bytes).

*** Por cierto, un conjunto de caracteres es un conjunto de símbolos y codificaciones. Una intercalación es un conjunto de reglas para comparar caracteres en un conjunto de caracteres https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

Pero, si elige un conjunto de caracteres de un solo byte (por ejemplo, latin1) en lugar de un conjunto de caracteres de múltiples bytes (por ejemplo, utf8 o ucs2), entonces el requisito de espacio para varbinary y varchar es el mismo.

VARBINARY es mejor que VARCHAR si no hay comprobación de validez. Por ejemplo, si el conjunto de caracteres predeterminado es UTF8, esto es ilegal:

CREATE TABLE t9 (s1 VARCHAR(5)); INSERT INTO t9 VALUES (0xF4808283);

Pero, esto es legal porque el conjunto de caracteres no importa:

CREATE TABLE t10 (s1 VARBINARY(5)); INSERT INTO t10 VALUES (0xF4808283);

Por lo tanto, VARCHAR compara caracteres usando una "intercalación" y VARBINARY compara bytes. La mayoría de las colaciones son "insensibles a mayúsculas y minúsculas", por lo que mayúsculas y minúsculas se consideran iguales. Dado que, varbinary no utiliza ninguna intercalación, las operaciones de búsqueda siempre distinguen entre mayúsculas y minúsculas en caso de varbinary.