MySQL konvertiert Bytes in Kilobytes, Megabytes, Gigabytes

Ich habe eine Protokolltabelle, die verschiedene Dateigrößen in Bytes speichert. Ich möchte in der Lage sein, die Datenbank abzufragen und den kleinstmöglichen Gleitkommawert zurückzugeben, der in MB GB usw. konvertiert wurde. Gegenwärtig kann ich den Wert in MB zurückgeben, aber wie teile ich weiter auf den kleinsten Wert auf und hänge die Einheit an?

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

Jede Hilfe wäre dankbar.

AKTUALISIEREN:

Aufgrund des von voodoo417 bereitgestellten Links habe ich meine Abfrage folgendermaßen aktualisiert: Dabei wird die relevanteste Dateigröße auf zwei Dezimalstellen ausgegeben und die Einheit angehängt (1000 Bytes, 1 KB, 500 MB, 2 GB usw.):

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
 user298509111. Jan. 2014, 09:34
Wie voodoo417 weiter unten verlinkt, möchte ich dies aber ausführen, ohne eine Benutzerfunktion zu definieren.myitforum.com/cs2/blogs/jnelson/archive/2008/01/11/111351.aspx
 Gordon Linoff11. Jan. 2014, 03:27
Können Sie einige Beispiele für die gewünschten Ergebnisse nennen?
 voodoo41711. Jan. 2014, 10:45
@ user2985091 schön!

Antworten auf die Frage(4)

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

Beispiel: 1024 = 1 GBselect concat(round(1024*1048576/1073741824,2),' GB') 1 gb

 gopi k22. Okt. 2016, 10:26
Das funktioniert gut
 Farside24. Okt. 2016, 12:12
Bitte formatieren Sie Ihre Antwort und erläutern Sie, wie diese die Frage beantwortet.

wenn die Dateigröße 0 ist (offensichtlich können Sie LOG nicht von Null ausführen). Daher ist @log mit null gefüllt und CONCAT erzeugt ebenfalls null. Richtige Lösung ist:

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'));
 Renaat De Muynck12. Nov. 2015, 17:28
Guter Punkt. Danke fürs Reparieren!

nktion):

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
AKTUALISIEREN:

Noch besser und kann außerhalb von Verfahren verwendet werden:

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

dass dies eine alte Frage ist, aber ich habe kürzlich nach der gleichen Frage gesucht und herausgefunden, dass MySQL 5.7 hinzugefügt wurdeformat_bytes Funktion genau für diesen Zweck:

mysql> SELECT format_bytes(512), format_bytes(18446644073709551615);
+-------------------+------------------------------------+
| format_bytes(512) | format_bytes(18446644073709551615) |
+-------------------+------------------------------------+
| 512 bytes         | 16383.91 PiB                       |
+-------------------+------------------------------------+
 Tim19. Feb. 2019, 00:45
@ AndreaBergonzo Ja in der Tat, müssen Sie verwendensys.format_bytes.
 Andrea Bergonzo25. Okt. 2018, 16:30
Wird das Sys-Schema benötigt? Es scheint so.
 PawelN21. Juni 2017, 15:21
SELECT VERSION (): 5.7.18-0ubuntu0.16.04.1 Kernelfehler: Fehler (1305) 42000: "FUNCTION format_bytes existiert nicht". Ja, ich habe Dokumentation gesehen :)

Ihre Antwort auf die Frage