根据问题的回答,MySQL中UUID的性能,回答者建议将UUID存储为数字而不是字符串。我不太确定如何做到这一点。有人可以给我提供建议吗?我的Ruby代码该怎么处理?
根据问题的回答,MySQL中UUID的性能,回答者建议将UUID存储为数字而不是字符串。我不太确定如何做到这一点。有人可以给我提供建议吗?我的Ruby代码该怎么处理?
110E8400-E29B-11D4-A716-446655440000
变为110E8400E29B11D4A716446655440000
。BINARY
大小为8位,因此BINARY(16)
是UUID的大小(8*16 = 128)。INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
并使用以下方式查询:
SELECT HEX(FieldBin) AS FieldBin FROM Table
现在在您的编程语言中,在第9、14、19和24个位置重新插入破折号,以匹配原始的UUID。如果位置总是不同,则可以将该信息存储在第二个字段中。CREATE TABLE `test_table` (
`field_binary` BINARY( 16 ) NULL ,
PRIMARY KEY ( `field_binary` )
) ENGINE = INNODB ;
INSERT INTO `test_table` (
`field_binary`
)
VALUES (
UNHEX( '110E8400E29B11D4A716446655440000' )
);
SELECT HEX(field_binary) AS field_binary FROM `test_table`
如果你想在任何十六进制字符串中使用这种技术,总是要对字段长度进行 length / 2
。所以对于一个 sha512,字段将是 BINARY (64)
,因为 sha512 编码的长度为 128 个字符。
110E8400-E29B-11D4-A716-446655440000
。只需像这样执行:SELECT * FROM test_table WHERE field_binary LIKE CONCAT("%", UNHEX('110E8400E29B11D4A716446655440000'), "%")
。 - David BélangerWHERE Field = UNHEX('110E8400E29B11D4A716446655440000')
。而不是写 WHERE Field = 3
或其他任何内容,当你使用十六进制字符串进行搜索、插入、更新、删除等操作时,需要用UNHEX将字段包装起来;当你想从MySQL中读取数据(使用SELECT)时,则需要用HEX将字段包装起来。 - David BélangerSELECT HEX(field_binary) AS field_binary FROM `test_table`
SELECT * FROM `test_table`
where field_binary=UNHEX('110E8400E29B11D4A716446655440000')
SELECT * FROM `test_table`
where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9'
可能导致许多问题。