2009-08-11 23 views
8

MySQL'de bir 64-bit değerine (bigint) bir dize eklemeyi deniyorum. Bir 128-bit karma bir ikili dize döndüren MD5() işlevinin farkındayım. Bu sonucun alt veya üst 64 bitini almaktan mutluluk duyarım. Ancak, bir ikili dize türünden herhangi bir türün sayısal türüne nasıl ulaşılacağını anlayamıyorum. Herhangi bir işaretçi?MySQL'de ikili dizgeyi bigint dosyasına dönüştürün?

cevap

14

kullan sayıya dönüştürmek için 10 ve CAST dayandırmak tabanından 16 ila MD5 karma dönüştürmek için CONV() fonksiyonu:

select cast(conv(substring(md5(id), 1, 16), 16, 10) as unsigned integer) from SomeTable; 
+1

Güzel, bu ben arıyorum. Oyuncuya ihtiyacım yok ya da bigint'e atmak istiyorum ama conv() işlevi gerçekten de eksik olduğum şeydi. –

+2

Son bir not. Bu sayısal değere Java'da uzun süre erişiyordum. Java tamsayı türleri imzalanır ve conv() 'nin sonucu her zaman pozitiftir, bu da bazı durumlarda taşmaları anlamına gelir. Bunu uzun zamandır imzalı olarak kullananlar için, oyuncuya ihtiyacınız var ve 'imzalı' olarak adlandırmak da hile yapıyor. –

2
CREATE FUNCTION dbo.HexStrToVarBinary(@hexstr varchar(8000)) 
RETURNS varbinary(8000) 
AS 
BEGIN 
    DECLARE @hex char(1), @i int, @place bigint, @a bigint 
    SET @i = LEN(@hexstr) 

    set @place = convert(bigint,1) 
    SET @a = convert(bigint, 0) 

    WHILE (@i > 0 AND (substring(@hexstr, @i, 1) like '[0-9A-Fa-f]')) 
    BEGIN 
     SET @hex = SUBSTRING(@hexstr, @i, 1) 
     SET @a = @a + 
    convert(bigint, CASE WHEN @hex LIKE '[0-9]' 
     THEN CAST(@hex as int) 
     ELSE CAST(ASCII(UPPER(@hex))-55 as int) end * @place) 
    set @place = @place * convert(bigint,16) 
     SET @i = @i - 1 

    END 

    RETURN convert(varbinary(8000),@a) 
END 
GO 

Source

+0

Nice'i! Orada bir şey olduğunu umuyordu. –

+0

Şimdi diğer yolla lütfen: D: @ :) –

İlgili konular