2012-06-24 18 views
9

¿Cuál es la diferencia entre MySQL UNHEX y X cuando se trata de valores hexadecimales en una base de datos?diferencia entre UNHEX y X (MySQL)

Por ejemplo.

SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring')); 

SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring'); 

Both me da el conjunto de resultados exacto. Entonces, ¿hay alguna diferencia? Implicaciones de rendimiento?

Editar: el tipo subyacente de guidCol es binaria, por supuesto

Respuesta

13

UNHEX() es a function, por lo tanto, se puede hacer algo como

SET @var = '41'; 
SELECT UNHEX(@var); 
SELECT UNHEX(hex_column) FROM my_table; 

X, por el contrario, es la sintaxis de una hexadecimal litteral. No se puede hacer esto:

SET @var = '41'; 
SELECT [email protected]; -- error (string litteral expected) 
SELECT X'@var'; -- error (`@` is not a hexadecimal digit) 
SELECT X(@var); -- returns NULL, not too sure about the reason... [edit: but this is probably why you are inserting NULL values] 
SELECT X(hex_column) FROM my_table; -- returns NULL as well 

Esto explica por qué siempre se consigue un mejor rendimiento con X: está utilizando una construcción del lenguaje en lugar de una llamada de función. X no necesita evaluar una variable, ya que espera una cadena literal.

+0

¡La respuesta correcta! Gracias.. – nawfal

1

Tenga en cuenta que incluso en MySQL 5.6, la notación X '' tiene un límite de longitud en el cliente de referencia mysql y UNHEX() no (parece). No sé cuál es el límite para X '', ya que no está oficialmente documentado, pero lo he encontrado al intentar INSERTAR un BLOB. Con X '' literal, el cliente mysql arrojó un error de sintaxis con una secuencia hexadecimal suficientemente larga, mientras que UNHEX() de la misma secuencia no lo hizo. Obviamente, la longitud no es un problema cuando se trata de un GUID real, pero pensé que esto es útil para cualquier otra persona que use esta pregunta para responder a la inserción de datos binarios de mysql en el caso general.

Cuestiones relacionadas