2012-06-24 52 views
9

Sự khác nhau giữa MySQL UNHEX và X khi xử lý các giá trị thập lục phân trong cơ sở dữ liệu là gì?Sự khác biệt giữa UNHEX và X (MySQL)

Ví dụ:

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

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

Cả hai đều cho tôi kết quả chính xác. Vậy có sự khác biệt nào không? Hiệu quả hoạt động?

Edit: loại cơ bản của guidCol là nhị phân dĩ nhiên

Trả lời

13

UNHEX()a function, do đó bạn có thể làm một cái gì đó giống như

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

X, mặt khác, là cú pháp cho một hexadecimal litteral. Bạn không thể làm điều này:

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 

Điều này giải thích lý do tại sao bạn luôn có được hiệu suất tốt hơn với X: bạn đang sử dụng một cấu trúc ngôn ngữ thay vì một lời gọi hàm. X không cần đánh giá biến vì nó mong đợi một chuỗi ký tự.

+0

Câu trả lời đúng! cảm ơn.. – nawfal

1

Lưu ý rằng ngay cả trong MySQL 5.6, ký hiệu X '' có giới hạn độ dài trong trình khách tham chiếu mysql và UNHEX() không (xuất hiện). Tôi không biết giới hạn của X '' là gì, vì nó không được viết chính thức nhưng tôi đã gặp nó khi cố gắng INSERT BLOB. Với X '', mysql client đã ném một lỗi cú pháp với một chuỗi hex đủ dài trong khi UNHEX() của cùng một trình tự thì không. Rõ ràng, chiều dài không phải là một vấn đề khi nói đến một GUID thực tế, nhưng tôi figured này là hữu ích cho bất cứ ai khác sử dụng câu hỏi này để trả lời mysql chèn dữ liệu nhị phân trong trường hợp chung.

Các vấn đề liên quan