【问题标题】:Store RGB colors in MySQL. Better as char or int?在 MySQL 中存储 RGB 颜色。 char 还是 int 更好?
【发布时间】:2014-06-17 04:19:40
【问题描述】:

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

<?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.';
        }
    ';
?>

“显示”表为每个设置的 CSS 属性提供一列。每行代表用户保存的一组颜色/字体/填充/边距设置。

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

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

在这种情况下,将值存储为 int 还是 char 是否有任何偏好?

【问题讨论】:

  • 始终将这些内容存储为字符串,而不是数字。电话号码通常也应存储为字符串,而不是数字
  • 我会将 CSS 属性值完全存储为数据库中的字符串(例如“#ab382d”)。如果不对 CSS 中的“#”进行硬编码,您甚至可以存储诸如“透明”或“蓝色”之类的内容,并且它仍然可以在您的 CSS 中使用。
  • 您的颜色可以有前导 0,因此一种选择是保存为字符串,另一种选择是使用 hexdec() 并存储为数字,但是您必须记住使用函数来获取十六进制通过倒车。
  • 谢谢。 Stilly.stack,你对电话号码的评论让我想起了教授的课。他教我们将电话号码存储为字符串,这样任何人都无法尝试对其进行数学运算。没有人需要乘以“555-555-5555”,但一个编程错误可能会将“电话”列与“应付金额”列混淆并尝试这样的操作。因此,我们将“电话”列设为字符串,从而确保错误会产生错误而不是错误数据。同样的逻辑在这里有效吗?
  • 不要为此使用 int。当您想要存储一些实际上是数字的数据时,请始终记住将其保存为数字,因为您想用它进行计算。使用电话号码或十六进制值,您不想计算某些东西。所以把它保存为一个字符。

标签: php mysql css rgb


【解决方案1】:

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

    扩展我的评论:

    由于这些值仅用于显示目的,因此我会将 CSS 属性值完全存储为数据库中的字符串,例如:

    #ab382d
    

    这将消除在您的 CSS 中放置“#”的需要,因此您可以潜在地存储诸如

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

    不需要知道如何渲染它。

    编辑:您可能还想考虑一种缓存机制,以减少可能不会经常更改的样式表信息对数据库的命中次数。

    【讨论】:

      【解决方案3】:

      这就是我所做的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 2018-04-03
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        相关资源
        最近更新 更多