fark

2012-06-24 20 views
9

Bir veritabanında onaltılık değerlerle çalışırken MySQL UNHEX ve X arasındaki fark gerçekten nedir?fark

Ör.

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

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

Her ikisi de tam sonuç kümesini verir. Yani bir fark var mı? Performans sonuçları?

Düzenleme: Öte yandan, sözdizimi bir için guidCol altında yatan tip nedenle

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

X gibi bir şey yapabilirsiniz,

cevap

13

UNHEX()a function olan tabii ikili olduğunu hexadecimal litteral. Sen bunu yapamaz: Eğer bir dil yapısı yerine bir işlev çağrı kullanıyoruz: Her zaman X ile daha iyi performans elde neden

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 

açıklıyor. X, bir litteral dize beklediği için bir değişkeni değerlendirmek zorunda değildir.

+0

Doğru cevap! Teşekkürler.. – nawfal

1

MySQL 5.6'da bile X '' notasının referans mysql istemcisinde bir uzunluk sınırı olduğunu ve UNHEX() 'in (görünmediğini) unutmayın. Resmi olarak belgelenmediği için X '' için sınırın ne olduğunu bilmiyorum ama BLOB'u INSERT yapmaya çalışırken karşılaştım. X '' literal ile, mysql istemcisi, aynı sekansın UNHEX'sini() içermezken, yeterince uzun bir hex sekansı ile bir sözdizimi hatası attı. Açıkçası, gerçek bir GUID'e gelindiğinde uzunluk bir sorun değildir, fakat bunun, genel sorudaki mysql veriyi mysql eklemesine cevap vermek için kullanan herkes için yararlı olduğunu düşündüm.