En la gran mayoría de consultas, resulta obvio qué colación
usa MySQL para resolver una operación de comparación. Por
ejemplo, en los siguientes casos, debe quedar claro que la
colación es “la colación de la columna
x
”:
SELECT x FROM T ORDER BY x; SELECT x FROM T WHERE x = x; SELECT DISTINCT x FROM T;
Sin embargo, cuando están implicados varios operandos, puede haber ambigüedad. Por ejemplo:
SELECT x FROM T WHERE x = 'Y';
¿Esta consulta debe usar la colación de la columna
x
, o de la columna de caracteres literal
'Y'
?
SQL estándar resuelve tales cuestiones usando lo que se solía
llamar reglas “coercitivas”. Es decir: Como
x
e 'Y'
tienen colaciones,
¿cuál tiene precedencia? Puede ser difícil de resolver, pero
las siguientes reglas resuelven la mayoría de situaciones:
Una cláusula COLLATE
explícita tiene
una coercibilidad de 0. (No es coercible en absoluto.)
La concatenación de dos cadenas de caracteres con diferentes colaciones tiene una coercibilidad de 1.
La colación de una columna tiene una coercibilidad de 2.
Una “constante de sistema” (la cadena de
caracteres retornada por funciones como
USER()
o VERSION()
)
tiene una coercibilidad de 3.
Una colación de un literal tiene una coercibilidad de 4.
NULL
o una expresión derivada de
NULL
tiene una coercibilidad de 5.
Los valores de coercibilidad precedentes son los de MySQL 5.0.3. Consúltese la nota posterior en esta sección para más información relacionada con versiones.
Estas reglas resuelven ambigüedades como:
Uso de la colación con el valor más bajo de coercibilidad.
Si ambos operadodres tienen la misma coercibilidad, entonces hay un error si las colaciones son distintas.
Ejemplos:
columna1 = 'A' |
Usa colación de columna1
|
columna1 = 'A' COLLATE x |
Usa colación de 'A'
|
columna1 COLLATE x = 'A' COLLATE y |
Error |
La función COERCIBILITY()
puede usarse para
determinar la coercibilidad de una expresión de cadena de
caracteres:
mysql> SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(VERSION()); -> 3 mysql> SELECT COERCIBILITY('A'); -> 4
Consulte Sección 12.9.3, “Funciones de información”.
En MySQL 5.0 antes de la versión 5.0.3, no hay constantes de
sistema o coercibilidad ignorables. Funciones como
USER()
tienen una coercibilidad de 2 en lugar
de 3, y los literales tienen una coercibilidad de 3 en lugar de
4.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.