将颜色存储在数据库中
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.
我已阅读 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.