Solución:
P: ¿Por qué MySQL se está convirtiendo a latin1_swedish_ci
en lugar de latin1_general_cs
?
Cada conjunto de caracteres tiene un defecto colación. Puedes usar el SHOW COLLATION
declaración para ver esto. Un extracto del resultado muestra que latin1_swedish_ci
es la intercalación predeterminada para el latin1
conjunto de caracteres:
Collation Charset Id Default Compiled Sortlen
-------------------- -------- ------ ------- -------- ---------
latin1_german1_ci latin1 5 Yes 1
latin1_swedish_ci latin1 8 Yes Yes 1
latin1_bin latin1 47 Yes 1
latin1_general_ci latin1 48 Yes 1
latin1_general_cs latin1 49 Yes 1
Ya sabemos que cada tabla tiene un juego de caracteres y una intercalación predeterminados. Con la definición de vista, MySQL en realidad crea una tabla cuando se ejecuta la consulta.
En la lengua vernácula de MySQL, se llama “tabla derivada”.
(Aparte, MySQL permite que algunas vistas se puedan definir con ALGORITHM=MERGE
en lugar de lo típico y familiar ALGORITHM=TEMPTABLE
. Con el algoritmo MERGE, obtenemos un comportamiento de manejo de vistas que se parece más al comportamiento de otras bases de datos relacionales, como Oracle y SQL Server).
Cuando MySQL crea la tabla derivada, asigna un conjunto de caracteres junto con su colación predeterminada.
Ahí es donde el latin1_swedish_ci
proviene de … la intercalación predeterminada para latin1
.
P2: ¿Cómo soluciono eso, además de usar CONVERT () explícitamente en la consulta?
Puede intentar especificar una intercalación sin la función CONVERT ():
CREATE VIEW example_view
AS
SELECT username COLLATE latin1_general_cs
FROM example
WHERE SUBSTRING_INDEX(USER(), '@', 1) COLLATE latin1_general_cs = example.username;
(Si el conjunto de caracteres de su cliente es utf8, es probable que encuentre un error con esa sintaxis, si no tiene también el CONVERT(... USING ...)
. Puedes usar COLLATE
en conjunción con el CONVERT()
función.
CONVERT(USER() USING latin1) COLLATE latin1_general_cs
NOTA: No tengo ninguna experiencia práctica con vistas almacenadas; utilizamos vistas en línea en todo el lugar. Pero nosotros Nunca crear vistas almacenadas, porque las vistas almacenadas causan una gran cantidad de problemas, mucho más grande y mucho más problemas que cualquier problema para el que la definición de vista fue una solución.