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.
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. –
@Damien: Saludos por eso. Hubiera estado feliz de votar y aceptar eso como una respuesta! Lo hará si elige hacerlo retrospectivamente. –
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'. –