Home >Database >Mysql Tutorial >Mysql中存储UUID去除横线的方法_MySQL

Mysql中存储UUID去除横线的方法_MySQL

ringa_lee
ringa_leeOriginal
2018-05-11 11:49:472529browse

通常用UUID做唯一标识,需要在数据库中进行存储。

UUID的格式

代码如下:

String string = UUID.randomUUID().toString();  
System.out.println(“uuid:” + string); 
uuid:05ba463f-1dab-471f-81c7-58e0b06f35f0

数据库中直接存储UUID的坏处:

完全‘随机'的字符串,例如由MD5()、SHA1()、UUID()产生的。它们产生的每一个新值都会被任意地保存在很大的空间范围内,这会减慢INSERT及一些SELECT查询。1)它们会减慢INSERT查询,因为插入的值会被随机地放入索引中。这会导致分页、随机磁盘访问及聚集存储引擎上的聚集索引碎片。2)它们会减慢SELECT查询,因为逻辑上相邻的行会分布在磁盘和内存中的各个地方。3)随机值导致缓存对所有类型的查询性能都很差,因为它们会使缓存赖以工作的访问局部性失效。如果整个数据集都变得同样“热”的时候,那么把特定部分的数据缓存到内存中就没有任何的优势了。并且如果工作集不能被装入内存中,缓存就会进行很多刷写的工作,并且会导致很多缓存未命中。

如果保存UUID值,就应该移除其中的短横线,更好的办法是使用UHEX()把UUID值转化为16字节的数字,并把它保存在BINARY(16)列中。

代码如下:

DELIMITER $$  
CREATE FUNCTION `GuidToBinary`(  
    $Data VARCHAR(36)  
) RETURNS binary(16)  
BEGIN
DECLARE $Result BINARY(16) DEFAULT NULL;  
    IF $Data IS NOT NULL THEN
SET $Data = REPLACE($Data,'-',”);  
SET $Result = CONCAT(UNHEX(SUBSTRING($Data,7,2)),UNHEX(SUBSTRING($Data,5,2)),UNHEX(SUBSTRING($Data,3,2)), UNHEX(SUBSTRING($Data,1,2)),  
                UNHEX(SUBSTRING($Data,11,2)),UNHEX(SUBSTRING($Data,9,2)),UNHEX(SUBSTRING($Data,15,2)) , UNHEX(SUBSTRING($Data,13,2)),  
                UNHEX(SUBSTRING($Data,17,16)));  
END IF;  
RETURN $Result;  
END
$$  
CREATE FUNCTION `ToGuid`(  
    $Data BINARY(16)  
) RETURNS char(36) CHARSET utf8  
BEGIN
DECLARE $Result CHAR(36) DEFAULT NULL;  
    IF $Data IS NOT NULL THEN
SET $Result = CONCAT(HEX(SUBSTRING($Data,4,1)),HEX(SUBSTRING($Data,3,1)),HEX(SUBSTRING($Data,2,1)), HEX(SUBSTRING($Data,1,1)) , ‘-',   
                HEX(SUBSTRING($Data,6,1)),HEX(SUBSTRING($Data,5,1)),'-',  
                HEX(SUBSTRING($Data,8,1)) , HEX(SUBSTRING($Data,7,1)),'-',  
                HEX(SUBSTRING($Data,9,2)),'-',HEX(SUBSTRING($Data,11,6)));  
END IF;  
RETURN $Result;  
END

代码如下:

CREATE FUNCTION `UUIDTOBIN`() RETURNS binary(16)   
BEGIN
DECLARE my_uuid char(36);   
SET my_uuid = UUID();   
RETURN CONCAT(UNHEX(LEFT(my_uuid,8)),UNHEX(MID(my_uuid,10,4)),UNHEX(MID(my_uuid,15,4)),UNHEX(MID(my_uuid,20,4)),UNHEX(RIGHT(my_uuid,12)));   
END
CREATE FUNCTION `BINTOUUID`(UUID BINARY(16)) RETURNS char(36)   
BEGIN
RETURN CONCAT(HEX(LEFT(uuid,4)),'-', HEX(MID(uuid,5,2)),'-', HEX(MID(uuid,7,2)),'-',HEX(MID(uuid,9,2)),'-',HEX(RIGHT(uuid,6)));   
END


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn