【问题标题】:MySQL Convert Bytes to Kilobytes, Megabytes, GigabytesMySQL 将字节转换为千字节、兆字节、千兆字节
【发布时间】:2014-01-11 01:20:53
【问题描述】:

我有一个以字节为单位存储各种文件大小的日志表。我希望能够查询数据库并返回已转换为 MB GB 等的最小可能浮点数。目前我可以以 MB 为单位返回值,但如何继续进一步除以最小值并附加单位?

SELECT CONCAT( ROUND( SUM( data_transferred ) /1048576, 2 ) ,  ' MB' ) 
FROM  `logs`

任何帮助将不胜感激。

更新:

根据 voodoo417 提供的链接,我将查询更新为以下内容,这会将最相关的文件大小输出到小数点后两位并附加单位(1000 字节、1 KB、500 MB、2 GB 等):

SET @bytes := (SELECT SUM(data_transferred) FROM wp_ddownload_statistics);

SELECT
    CASE
WHEN ABS(@bytes) < 1024 THEN CONCAT( ROUND( @bytes, 2 ), ' Bytes')
      WHEN ABS(@bytes) < 1048576 THEN CONCAT( ROUND( (@bytes/1024), 2 ), ' KB')
      WHEN ABS(@bytes) < 1073741824 THEN CONCAT( ROUND( (@bytes/1048576), 2 ), ' MB')
      WHEN ABS(@bytes) < 1099511627776 THEN CONCAT( ROUND( (@bytes/1073741824), 2 ), ' GB' )
      WHEN ABS(@bytes) < 1125899906842624 THEN CONCAT( ROUND( (@bytes/1099511627776), 2 ), ' TB')
      WHEN ABS(@bytes) < 1152921504606846976 THEN CONCAT( ROUND( (@bytes/1125899906842624), 2 ), ' PB' )
      WHEN ABS(@bytes) < 1180591620717411303424 THEN CONCAT( ROUND( (@bytes/1152921504606846976) ,2), ' EB' )
      WHEN ABS(@bytes) < 1208925819614629174706176 THEN CONCAT( ROUND( (@bytes/1180591620717411303424), 2), ' ZB' )
      WHEN ABS(@bytes) < 1237940039285380274899124224 THEN CONCAT( ROUND( (@bytes/1208925819614629174706176), 2), ' YB' )
      WHEN ABS(@bytes) < 1267650600228229401496703205376 THEN CONCAT( ROUND( (@bytes/1237940039285380274899124224), 2), ' BB' )
    END

【问题讨论】:

标签: mysql byte filesize megabyte


【解决方案1】:

我知道这是一个老问题,但我最近也在寻找同样的东西,发现 MySQL 5.7 正是为此目的添加了format_bytes 函数:

mysql> SELECT format_bytes(512), format_bytes(18446644073709551615);
+-------------------+------------------------------------+
| format_bytes(512) | format_bytes(18446644073709551615) |
+-------------------+------------------------------------+
| 512 bytes         | 16383.91 PiB                       |
+-------------------+------------------------------------+

【讨论】:

  • SELECT VERSION(): 5.7.18-0ubuntu0.16.04.1 内核错误:错误(1305)42000:“FUNCTION format_bytes 不存在”。是的,我看到了文档:)
  • 是否需要使用 sys 架构?好像是这样。
  • @AndreaBergonzo 是的,你需要使用sys.format_bytes
【解决方案2】:

我有一个更优雅的解决方案(也使用用户定义的函数):

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

更新:

更好,并且可以在程序之外使用:

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'));

【讨论】:

    【解决方案3】:

    当文件大小为 0 时,Renaat 的代码会失败(显然你不能从零开始 LOG)。因此@log 填充了 null 并且 CONCAT 也产生了 null 。 正确的解决方法是:

    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'));
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 请格式化您的答案,并详细说明这是如何回答问题的。
      【解决方案5】:

      关于使用 format_bytes 的最佳答案,尽管在 2016 年得到了回答,但遗憾的是在 MariaDB 中仍未找到。

      我修改了来自 here 的查询,以创建一个我可以使用的函数。

      FUNCTION `format_bytes`(val float) RETURNS varchar(20) CHARSET latin1
      BEGIN
          DECLARE pw smallint;
          IF val < 1024 THEN
              return CONCAT(val, ' B');
          END IF;
          SET pw = LEAST(7, FLOOR(LOG(val) / LOG(1024)));
          RETURN CONCAT(ROUND(val / POW(1024, pw), 2), ' ', SUBSTR('KMGTPEZY', pw, 1), 'B');
      END
      
      
      
      >>> SELECT format_bytes(512), format_bytes(18446644073709551615);
      +-------------------+------------------------------------+
      | format_bytes(512) | format_bytes(18446644073709551615) |
      +-------------------+------------------------------------+
      | 512 B             | 16.00 EB                           |
      +-------------------+------------------------------------+
      

      可以调整一些东西以更接近地模仿 MySQL format_bytes,但这不是我的目标。

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2016-06-08
        • 2011-01-22
        • 2010-10-08
        • 2018-05-08
        • 1970-01-01
        相关资源
        最近更新 更多