Então, como uma resposta aos comentários. A maneira correta de armazenar um UUID de 36 caracteres como binário(16) é realizar a inserção de uma maneira como:
INSERT INTO sometable (UUID) VALUES
(UNHEX(REPLACE("3f06af63-a93c-11e4-9797-00505690773f", "-","")))
UNHEX
porque um UUID já é um valor hexadecimal. Aparamos (REPLACE
) os traços na instrução para reduzir o comprimento para 32 caracteres (nossos 16 bytes representados como HEX
). Você pode fazer isso a qualquer momento antes de armazená-lo, obviamente, para que não precise ser manipulado pelo banco de dados. Você pode recuperar o UUID assim:
SELECT HEX(UUID) FROM sometable;
Apenas no caso de alguém se deparar com este tópico e não tiver certeza de como isso funciona.
E lembre-se:se você estiver selecionando uma linha usando o UUID, use
UNHEX()
na condição :SELECT * FROM sometable WHERE UUID = UNHEX('3f06af63a93c11e4979700505690773f');
ou notação literal (como mencionado por Alexis Wilke):
SELECT * FROM sometable WHERE UUID = 0x3f06af63a93c11e4979700505690773f;
E NÃO
HEX()
na coluna: SELECT * FROM sometable WHERE HEX(UUID) = '3f06af63a93c11e4979700505690773f';
A última solução, enquanto funciona, requer que o MySQL
HEX
es todos os UUIDs antes de poder determinar quais linhas correspondem. É muito ineficiente. Edit:Se você estiver usando o MySQL 8, você deve dar uma olhada nas funções UUID, conforme mencionado na resposta do SlyDave. Esta resposta ainda está correta, mas não otimiza os índices UUID que podem ser feitos nativamente usando essas funções. Se você estiver no MySQL 8, poderá implementar o polyfill do Devon, que fornece funcionalidade idêntica nas versões anteriores do MySQL.