Saltar al contenido

MySQL coacciona implícitamente a una intercalación incorrecta a la vista

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *