如何对数据以字节为单位的mysql列进行排序?
我有一个列为“size”的表,它的文件大小以不同的单位表示,如“10KB”、“50MB”、“1GB”。 问题是当我尝试排序时,它首先返回1GB行 如何在不更改旧数据的情况下解决此问题如何对数据以字节为单位的mysql列进行排序?,mysql,search,sorting,Mysql,Search,Sorting,我有一个列为“size”的表,它的文件大小以不同的单位表示,如“10KB”、“50MB”、“1GB”。 问题是当我尝试排序时,它首先返回1GB行 如何在不更改旧数据的情况下解决此问题 非常感谢您的帮助。。。谢谢。让“大小”包含实际值,并将其格式化到更高的位置(在您的视图中) 或者你可以把它弄得难看,然后写一个函数,它接受一个人类可读的值,返回实际的整数,然后按foo(大小)排序。我说过它很难看吗 编辑:由于您希望保留旧数据,下面是另一个丑陋的解决方案: 按替换排序(替换(替换(大小,'GB','
非常感谢您的帮助。。。谢谢。让“大小”包含实际值,并将其格式化到更高的位置(在您的视图中) 或者你可以把它弄得难看,然后写一个函数,它接受一个人类可读的值,返回实际的整数,然后按foo(大小)排序。我说过它很难看吗 编辑:由于您希望保留旧数据,下面是另一个丑陋的解决方案: 按替换排序(替换(替换(大小,'GB','000MB'),'MB','000KB'),'GB','000') (我着火了!)
Disclamer:您真的应该更改数据,这是保持数据干净的唯一方法。您真的应该将所有数据转换为一个公共单位(比如字节),或者添加一个包含“度量单位”的列,并保持大小列本身为数字 话虽如此,以下内容应适用于以GB/MB/KB或B结尾的数据
select size
from t
order
by case when size like '%GB' then power(1024, 3) * substr(size, 1, length(size) - 2)
when size like '%MB' then power(1024, 2) * substr(size, 1, length(size) - 2)
when size like '%KB' then power(1024, 1) * substr(size, 1, length(size) - 2)
when size like '%B' then substr(size, 1, length(size) - 1)
end desc;
+-------+------------+
| size | bytes |
+-------+------------+
| 1GB | 1073741824 |
| 10MB | 10485760 |
| 100KB | 102400 |
| 1000B | 1000 |
+-------+------------+
+!,, @如果你真的想把数据存储在字节中,那么在别处格式化就很容易了。我以前犯过一个错误。我以不同的格式存储数据。你建议我改变100+数千行?这是一个简单的改变。编写一个简单的脚本,在一个小但有代表性的数据集上彻底测试它,并让它通宵工作。我宁愿将大小存储在字节中,并且在输出时仅将格式设置为人类可读的格式。在我看来,长期的解决方案必须是更改这些值。一个字段应该只存储一个度量值,比如Kb,然后在需要时转换为Gb等。否则,处理数据总是有点混乱。我将所有数据更改为字节,并对我的所有应用程序使用相同的方法。+1是一个真正好的方法。很可能,每个insert和update SQLs也应该在不更改应用程序代码的情况下自动填充
bytes
列。@Nishant,呵呵。。。我希望你是指我的第一句话?否则我就不想投票了,因为这是命令#是的。我指的是新专栏。这是一个很好的补丁,如果你可以转换旧的单位,并且每次更新和插入都会处理好它,那么你就不必接触应用程序代码。我们应该得到一个+1.:)