MySQL Convert Bytes to Kilobytes, Megabytes, Gigabytes

后端 未结 4 2022
旧时难觅i
旧时难觅i 2020-12-11 02:28

I have a logs table that stores various file sizes in bytes. I want to be able to query the database and return the smallest possible float which has been converted to MB GB

相关标签:
4条回答
  • 2020-12-11 02:42

    I know this is an old question, but I was looking for the same thing recently, and found out that MySQL 5.7 added format_bytes function exactly for this purpose:

    mysql> SELECT format_bytes(512), format_bytes(18446644073709551615);
    +-------------------+------------------------------------+
    | format_bytes(512) | format_bytes(18446644073709551615) |
    +-------------------+------------------------------------+
    | 512 bytes         | 16383.91 PiB                       |
    +-------------------+------------------------------------+
    
    0 讨论(0)
  • 2020-12-11 02:43

    Renaat's code is failing when filesize is 0 (obviously you can't do LOG from zero). Therefore @log is filled with null and CONCAT produce null as well. Correct fix is:

    SET @filesize = 536870912;
    SET @log = IFNULL(TRUNCATE(LOG(1024, @filesize), 0),0);
    SELECT CONCAT(ROUND(@filesize / POW(1024, @log), 2), ' ',
                ELT(@log + 1, 'Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB'));
    
    0 讨论(0)
  • 2020-12-11 02:48

    select concat(round(data*1048576/1073741824,2),' GB')

    for example: 1024 = 1gb select concat(round(1024*1048576/1073741824,2),' GB') 1gb

    0 讨论(0)
  • 2020-12-11 02:54

    I have a more elegant solution (also using a user defined function):

    CREATE FUNCTION `format_filesize`(filesize FLOAT) RETURNS varchar(20) CHARSET utf8
    BEGIN
    
    DECLARE n INT DEFAULT 1;
    
    LOOP
        IF filesize < 1024 THEN
            RETURN concat(round(filesize, 2), ' ', elt(n, 'Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB'));
        END IF;
        SET filesize = filesize / 1024;
        SET n = n + 1;
    END LOOP;
    
    END
    

    UPDATE:

    Even better, and can be used outside procedures:

    SET @filesize = 536870912;
    SET @log = IFNULL(TRUNCATE(LOG(1024, @filesize), 0),0);
    SELECT CONCAT(ROUND(@filesize / POW(1024, @log), 2), ' ',
                ELT(@log + 1, 'Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB'));
    
    0 讨论(0)
提交回复
热议问题