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

Dha*_*ana 44 colors

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

我怎样才能以最佳方式在数据库字段中存储颜色?,按颜色名称或其他?

Eoi*_*ell 37

如果它用于HTML页面,将#RRGGBB标记存储为字符串就足够了.

如果它用于.NET,它支持从其ARGB值构建颜色

System.Drawing.Color c = System.Drawing.Color.FromArgb(int);

int x = c.ToArgb();
Run Code Online (Sandbox Code Playgroud)

所以你可以存储那个int.

  • 需要注意的一件事 - System.Drawing.Color 是这样,但 System.Windows.Media.Color 不是这样 - 它没有 ToArgb() 方法。我最终存储了来自 ToString() 方法的 #AARRGGBB 值,并在各个部分使用 byte.Parse(value, NumberStyles.HexNumber) 来获取要传递给它的 FromArgb() 方法的值,该方法期望每个组件都有不同的字节值. (2认同)

Bee*_*jor 17

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

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

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

  • 假设上下文默认颜色为NULL,空白或无效
  • 接受可选的尾随字母00-FF,假设FF(不透明),如果省略
  • 接受完整(AABBCC)和速记(ABC)语法,这是一半大小,输入更快,CSS支持
  • 支持可选的前导#数字,这很常见
  • 支持原始字符串,保存任何CSS支持,如"rgba(255,255,255,1)"或"红色"
  • 支持自定义颜色模式字符串,如"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字段.快速排序和搜索,您需要的任何颜色数据,无需任何转换,并且极易扩展.您还可以将表保留在自己的数据库文件中,以便由应用程序中的任何其他数据库或脚本共享.无可否认,对于大多数情况来说,这种解决方案是过度的.

  • 这个过分的想法太棒了!不要退缩!:) (3认同)

Jim*_*meh 14

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

  • 或者只是FFFFFF或FF0000,#在数据库中是多余的,就好像你以这种形式存储它所有的颜色字符串都将以#开头,这意味着你需要存储不必要的数据. (14认同)
  • 我不认为这是不必要的,也许他有一个能够读取(例如,读取/写入CSS颜色字段)"黑色"和"#FFFFFF"的功能.他怎么能在后端知道他得到一个十六进制或一个名字?他将不得不处理一些令人烦恼和冗长的代码. (2认同)
  • @Seraf 我认为如果某人的颜色字段旨在同时存储颜色名称和颜色十六进制值,那么最好重新考虑该方法并始终在数据库保存/编辑时将颜色名称值转换为十六进制值。 (2认同)

rjs*_*ing 13

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

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

  • 如今,空间如此便宜,我倾向于坚持使用人类可读但略大的方式. (16认同)
  • 为什么不将它存储为十六进制并放弃#?十六进制本身与人类可读的形式相同,它们都需要从#开始,所以只需将其添加到软件中...... (8认同)

Geo*_*ord 5

将其存储为 int

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