我怎样才能在数据库字段中存储颜色?

时间:2009-04-24 11:59:15

标签: colors

我必须在数据库中存储颜色。

如何以最佳方式在数据库字段中存储颜色?,按颜色名称或其他方式?

12 个答案:

答案 0 :(得分:37)

如果是HTML页面,将#RRGGBB标记存储为字符串就足够了。

如果是.NET,它支持从ARGB值

构建颜色
System.Drawing.Color c = System.Drawing.Color.FromArgb(int);

int x = c.ToArgb();

所以你可以存储那个int。

答案 1 :(得分:14)

可能颜色值最好,例如#FFFFFF或#FF0000

答案 2 :(得分:13)

将颜色存储为24或32位整数,如HTML / CSS,即#FF00CC,但转换为整数而不是字符串。

整数占用的空间比字符串少(特别是VCHAR)。

答案 3 :(得分:12)

理想的存储格式取决于您计划如何使用数据库。

最简单的解决方案当然只是将所有内容存储为RGB颜色的6字节ASCII十六进制字符串,而不支持任何其他格式。如果您以后想要支持其他格式,可能会遇到问题。

为了提高可读性,灵活性和易用性,使用普通字符串是一个好主意。在大多数情况下,十六进制颜色字符串和原始整数之间的存储空间差异可以忽略不计。为了提高速度,您可以设置要编制索引的颜色字段。为了灵活性,您可以添加以下一项或多项功能:

  • 假设上下文默认颜色为NULL,空白或无效
  • 接受可选的尾随字母字节00-FF,假设FF(不透明),如果省略
  • 接受完整(AABBCC)和速记(ABC)语法,这是一半的大小,更快的输入和CSS支持
  • 支持可选的前导#数字,这是常见的
  • 支持原始字符串,保存任何CSS支持,如“rgba(255,255,255,1)”或“red”
  • 支持自定义颜色模式字符串,例如“cmyk(),hsv(),hsl(),lab()”等。
  • 假设RGB(A)十六进制字符串,如果它以#开头或长度为3,4,6或8且仅包含[0-9A-Fa-f]

要优化搜索和排序速度,以及磁盘使用,存储为无符号整数是可行的方法。这是因为单个数字比一串字符更快搜索,可以在内部存储少量几个,您仍然可以使用FromArgb()和类似函数在查询中按颜色通道进行过滤。缺点是你的代码需要不断地为每个查询中的每个颜色字段来回转换事物,这实际上可能抵消任何数据库速度增益。

混合方法可能值得探索。例如,考虑一个包含所有可能的每通道8位RGB值的表,其中的字段由id,rgbhex,cssname,cmyk,hsl,hsv,lab,rgb等组成。您需要自动化创建这样一个表,因为它会如此之大(16777216条目)。它将为您的表添加超过16 MB,但此解决方案的优点是所有颜色值都只是与颜色查找表的外键链接的单个整数id字段。快速排序和搜索,您需要的任何颜色数据,无需任何转换,并且极易扩展。您还可以将表保留在自己的数据库文件中,以便由应用程序中的任何其他数据库或脚本共享。无可否认,对于大多数情况来说,这种解决方案是过度的。

答案 4 :(得分:4)

将其存储为int

使用ToArgb和FromArgb设置并获取值。

答案 5 :(得分:3)

我认为这取决于。如果你只需要存储颜色,那么十六进制表示法应该没问题。如果您需要针对特定​​颜色通道执行查询,那么您需要为每个颜色通道(无论是RGB,ARGB,CYMK等)使用smallint字段。

因此,对于简单存储,请保持简单。如果您需要执行分析,则需要考虑问题域所指示的备用选项。

答案 6 :(得分:1)

我建议使用3列颜色查找表:

ID int; 名称varchar(40)null; ColorVal char(8)或int(取决于你如何表示颜色)

对于未命名的颜色,只需将名称字段保留为空

答案 7 :(得分:0)

如果颜色仅限于网页颜色,我会选择十六进制表示法。

例如#0000FF代表蓝色。

此处有更多信息:http://en.wikipedia.org/wiki/Web_colors

答案 8 :(得分:0)

您希望将颜色存储在哪种格式? CMTK,RGB,Pantone? 它有助于了解...严格的#RGB十六进制格式如果用于网页颜色或应用程序,则效果很好,但如果您尝试混合颜料则不太好。

答案 9 :(得分:0)

我将它存储为char(9)。

  • 包含'#' - 符号,以便我不必在代码中添加它并立即使用
  • 普通字符代替nchar
  • 存储透明度

答案 10 :(得分:0)

在数据库中保存颜色:

     //Save this int value in database
    int argb = colorDialog1.Color.ToArgb();

并从数据库使用中检索它:

    //argb is the value of color stored in database in prev. section
    Color.FromArgb(argb)

答案 11 :(得分:-2)

你为什么不同时使用两者?表结构将是Key的Int ARGB和Name的varchar。

ARGB (Key), Name
FFFFFFFF  ,Black
FF000000  ,White