将颜色存储在数据库中

Storing colours in a database

我已阅读 this question 并且接受的答案建议将颜色值作为字符串存储在数据库中。但是,为该问题存储这些值的目的是为了显示目的。

我会想象使用 SUBSTRING()CONV() 获取值并将它们转换为整数比按位运算慢(或者我可以在应用程序端转换为整数,无论​​是PHP 或 Node,但这仍然需要时间):

SELECT CONV(SUBSTRING(colour, 1, 2), 16, 10) AS red,
       CONV(SUBSTRING(colour, 3, 2), 16, 10) AS green,
       CONV(SUBSTRING(colour, 5, 2), 16, 10) AS blue
  FROM table
 WHERE conditions;

相比于:

SELECT (colour >> 16) & 0xFF AS red,
       (colour >> 8) & 0xFF AS green,
       colour & 0xFF AS blue
  FROM table
 WHERE conditions;

(那些是伪代码,但你明白了。)

将它们存储为整数是否合适(即 24 位 RGB 为 UNSIGNED MEDIUMINT 和 32 位 RGBA 为 UNSIGNED INT)?

性能差异会很小。一般来说,运算符(>>、& 等)和函数调用(CONV 等)不如获取记录重要。

为此,如果您有很大的 table(千兆字节),缩小数据类型是最重要的事情。这将缩小数据,从而减少 I/O.

MEDIUMINT UNSIGNED 是 RGB 最紧凑的可能 -- 3 个字节。 (BINARY(3) 也是 3 个字节;代码可能是其他内容。)

您的第一个示例似乎将十六进制存储在 CHAR(6) 中。这将占用 6 个字节,如果您有 CHAR(6) CHARACTER SET utf8,则占用 18 个字节。 VARCHAR(6) 大约是 8 个字节。因此,我不喜欢第一个提供的选项。

您也可以考虑使用 MySQL 的设计用途——只是一个数据存储库。然后将 parsing/interpretation 等留给应用程序。也就是说,写入 SQL 来存储和检索 "colour" 而不知道或关心哪个 bits/bytes 引用 Red/etc.