我必须在数据库中存储颜色。
如何以最佳方式在数据库字段中存储颜色?,按颜色名称或其他方式?
答案 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十六进制字符串,而不支持任何其他格式。如果您以后想要支持其他格式,可能会遇到问题。
为了提高可读性,灵活性和易用性,使用普通字符串是一个好主意。在大多数情况下,十六进制颜色字符串和原始整数之间的存储空间差异可以忽略不计。为了提高速度,您可以设置要编制索引的颜色字段。为了灵活性,您可以添加以下一项或多项功能:
要优化搜索和排序速度,以及磁盘使用,存储为无符号整数是可行的方法。这是因为单个数字比一串字符更快搜索,可以在内部存储少量几个,您仍然可以使用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)
答案 8 :(得分:0)
您希望将颜色存储在哪种格式? CMTK,RGB,Pantone? 它有助于了解...严格的#RGB十六进制格式如果用于网页颜色或应用程序,则效果很好,但如果您尝试混合颜料则不太好。
答案 9 :(得分:0)
我将它存储为char(9)。
答案 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