2011-05-12 27 views
16

Hace un tiempo, hice una pregunta sobre la clasificación de jerarquía/número de versión en SQL Server. ( How Can I Sort A 'Version Number' Column Generically Using a SQL Server Query).¿Cuál es la ventaja de usar varbinary sobre varchar aquí?

Entre las respuestas que se enviaron estaba this link to a TSQL Coding challenge with much the same puzzle.

En la solución SQL2000 el autor demostró una dos variaciones, uno usando y devolver un varchar y el otro varbinary. El autor explica que está haciendo esto sin explicar POR QUÉ.

Por lo tanto, mi pregunta es realmente, ¿qué diferencias principales ventajas/(si lo hay) de la diferencia de enfoque? Es decir. ¿Por qué usar varbinary en lugar de varchar?

he omitido la publicación del código, como su más elegante resumida en el artículo anterior.

+1

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 que se produzcan comparaciones, debería ser más eficiente. Pero también creo que no hay muchas diferencias prácticas en la eficiencia para la mayoría de los usuarios. –

+0

@Damien: Saludos por eso. Hubiera estado feliz de votar y aceptar eso como una respuesta! Lo hará si elige hacerlo retrospectivamente. –

+1

Supongo que es porque el resultado se va a utilizar para la clasificación y el binario puede ser más eficiente, ya que no tiene que preocuparse por la intercalación. Pero no estoy seguro de si eso es cierto en general e incluso si es cierto, en general, no tengo idea de cómo se compararía la clasificación de una cadena con una cláusula binaria de 'compilación'. –

Respuesta

12

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 las comparaciones que se produzcan, deberían ser más eficientes.

Pero yo recomendaría que si estuviera buscando utilizar cualquiera de las soluciones, implemente ambas (son bastante cortas) y pruebe algunos perfiles contra sus datos reales (y patrones de consulta), para ver si hay diferencias prácticas (no lo esperaría)

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

0

Si utilizamos varchar para almacenar cadenas y usar diferentes intercalaciones para diferentes columnas varchar, entonces podríamos obtener el error "Mezcla no válida de intercalaciones" en la consulta SQL. (Por ejemplo, si queremos comparar dos cadenas de intercalaciones incompatibles o intentamos seleccionar datos de diferentes intercalaciones en una columna combinada).

Pero eso puede solucionarse si especificamos "COLLATE" en la consulta. Por ejemplo:

WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs . 

Pero, esto elimina cualquier ÍNDICE que pueda tener.

Para protegerse contra la "combinación no válida de colaciones" errores, podemos utilizar varbinary.

varbinary utiliza menos espacio que varchar si el cotejo de varios bytes se utiliza para la columna varchar. (las cadenas binarias no tienen conjuntos de caracteres ni intercalaciones. Las cadenas binarias son simplemente una secuencia de valores de bytes).

Pero, si elige un juego de caracteres de un solo byte (por ejemplo, latin1) en lugar de juego de caracteres de varios bytes (por ejemplo, utf8 o ucs2), los requisitos de espacio para varbinary y varchar son los mismos.

VARBINARY es mejor que VARCHAR si no hay comprobación de validez. Por ejemplo, si el conjunto de caracteres por defecto es UTF-8, entonces 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); 

Así, VARCHAR compara caracteres usando una "intercalación" y VARBINARY comparar bytes.La mayoría de las intercalaciones son "insensibles a mayúsculas y minúsculas", por lo que las mayúsculas y minúsculas se consideran iguales. Dado que varbinary no usa ninguna intercalación, las operaciones de búsqueda son siempre sensibles a mayúsculas y minúsculas en el caso de varbinary.

Cuestiones relacionadas