在MySQL中存储RGB颜色。更好的char或int?

时间:2014-04-30 17:59:09

标签: php mysql css rgb

我使用PHP从MySQL数据库中查询CSS设置,然后将其回显到CSS样式表中。示例代码段如下:

<?php
    $connect = //connect string
    $query = ($connect, "SELECT bgcolor, font FROM displays WHERE name = 'mySettings'");
    while ($row = mysqli_query($query)){
        $bgcolor = $row[bgcolor];
        $font = $row[font];
    }
    echo '
        body {
            background-color: #'.$bgcolor.';
            font: '.$font.';
        }
    ';
?>

表&#34;显示&#34;每个CSS属性都有一列设置。每行代表用户保存的一组颜色/字体/填充/边距设置。

列&#34;字体&#34;是数据类型varchar(50)。什么数据类型应该&#34; bgcolor&#34;是? CSS希望看到十六进制值,但MySQL中没有十六进制数据类型。逻辑选择是将值存储为int类型,并在SELECT语句中使用HEX()函数。

然后,是否可以更容易和/或使用更少的空间将其存储为char(6)? PHP只是作为字符串处理,而不是实际的数字。十六进制值不会应用任何数学函数;它只是粘贴到CSS中。

在这种情况下,将值存储为int还是char?

之间是否有任何偏好?

3 个答案:

答案 0 :(得分:12)

扩展我的评论:

由于这些值仅用于显示目的,我将CSS属性值完全存储,无论它是什么,作为数据库中的字符串,例如:

#ab382d

这样就无需使用&#39;#&#39;坐在你的CSS中,这样你就可以存储诸如

之类的值
  • transparent
  • blue
  • rgb(100, 100, 100)
  • (或任何其他有效的background-color属性值)

无需知道如何渲染它。

编辑:您可能还想考虑一种缓存机制,以减少数据库中针对样式表信息的点击次数,这些信息可能不会经常发生变化。

答案 1 :(得分:5)

24位和32位RGB值可以表示为32位整数,因此为了有效存储,您可以使用int,但是您始终需要将其解码为人类可读或CSS - 加载和保存时可读。

伪码:

 UInt32 rgba  = color.R | ( color.G << 8 ) | ( color.B << 16 ) | ( color.A << 24 );
 Color  color = Color.FromRgba( rgba & 0xFF, ( rgba >> 8 ) & 0xFF, ( rgba >> 16 ) & 0xFF, ( rgba >> 24 ) & 0xFF );

答案 2 :(得分:0)

这就是我所做的:

将红色,绿色和蓝色存储在不同的列中。每个都是TINYINT。由于tinyint介于0..255(无符号)之间,因此不会浪费任何一个位,您可以根据需要过滤结果(红色,粉彩,暗色调等)。