Как я могу сохранить цвет в поле базы данных? - PullRequest
43 голосов
/ 24 апреля 2009

Я должен хранить цвета в базе данных.

Как лучше всего сохранить цвет в поле базы данных? По названию цвета или как-то еще?

Ответы [ 12 ]

37 голосов
/ 24 апреля 2009

Если это для HTML-страницы, вероятно, достаточно сохранить тег #RRGGBB в виде строки.

Если это для .NET, он поддерживает создание цвета из значения ARGB

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

int x = c.ToArgb();

чтобы вы могли просто сохранить этот int.

14 голосов
/ 24 апреля 2009

Возможно, значение цвета будет наилучшим, например, #FFFFFF или # FF0000

13 голосов
/ 24 апреля 2009

Сохранить цвет как 24- или 32-битное целое число, как в HTML / CSS, т.е. # FF00CC, но преобразовать в целое число, а не в строку.

Целые числа занимают меньше места, чем строки (особенно VCHAR).

12 голосов
/ 18 января 2015

Идеальный формат хранения зависит от того, как вы планируете использовать базу данных.

Самое простое решение - это, конечно, просто сохранение всего в виде шестнадцатеричной шестнадцатеричной строки ASCII цвета RGB без поддержки какого-либо другого формата. Хотя вы можете столкнуться с проблемами, если позже захотите поддерживать дополнительные форматы.

Для удобства чтения, гибкости и простоты доступа, использование простой строки - хорошая идея. Разница в объеме памяти между шестнадцатеричной строкой цвета и необработанным целым числом в большинстве случаев незначительна. Для повышения скорости вы можете установить цветное поле для индексации. А для большей гибкости вы можете добавить одну или несколько из следующих функций:

  • Предположим, что контекстный цвет по умолчанию задан 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() и аналогичные функции. Недостатком является то, что ваш код должен постоянно преобразовывать вещи назад и вперед для каждого цветового поля в каждом запросе, что может фактически компенсировать любое увеличение скорости базы данных.

Гибридный подход может стоить изучить. Например, рассмотрим таблицу всех возможных значений RGB по 8 бит на канал с полями, состоящими из таких вещей, как id, rgbhex, cssname, cmyk, hsl, hsv, lab, rgb и т. Д. Вам необходимо автоматизировать создание такой таблицы, поскольку она будет такой большой (16777216 записей). Это добавит к вашей таблице более 16 МБ, но преимущество этого решения состоит в том, что все ваши значения цвета будут просто одним целочисленным полем id, связанным с внешним ключом для таблицы поиска цветов. Быстрая сортировка и поиск, любые данные о цвете, которые вам нужны без какого-либо преобразования, и чрезвычайно расширяемые. Вы также можете хранить таблицу в своем собственном файле базы данных для совместного использования с любой другой базой данных или скриптом в вашем приложении. По общему признанию это решение является излишним для большинства случаев.

4 голосов
/ 24 апреля 2009

Хранить как int

Используйте ToArgb и FromArgb для установки и получения значений.

3 голосов
/ 24 апреля 2009

Я думаю, это зависит. Если вам просто нужно сохранить цвет, то шестнадцатеричная запись должна быть в порядке. Если вам нужно выполнить запросы к определенным цветным каналам, то вам понадобятся поля smallint для каждого цветового канала (будь то RGB, ARGB, CYMK и т. Д.).

Итак, для простого хранения, сохраняйте это простым. Если вам необходимо выполнить анализ, вам нужно будет рассмотреть альтернативные варианты, которые определяются вашей проблемной областью.

1 голос
/ 24 апреля 2009

Я предлагаю иметь таблицу соответствия цветов с 3 столбцами:

ID int; Имя varchar (40) ноль; ColorVal char (8) или int (в зависимости от того, как вы представляете цвета)

Для неназванных цветов просто оставьте поле имени пустым

0 голосов
/ 04 августа 2014

Сохранить цвет в базе данных:

     //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)
0 голосов
/ 03 декабря 2013

Я храню его как символ (9).

  • Включен знак «#», чтобы мне не приходилось добавлять его в код и использовать его немедленно
  • Обычный символ вместо nchar
  • Магазины прозрачности
0 голосов
/ 24 апреля 2009

В каком формате вы хотите хранить цвета? CMTK, RGB, Pantone? Это как бы помогает знать ... строго шестнадцатеричный формат #RGB прекрасно работает, если он подходит для веб-цветов или приложений, но не так хорош, если вы пытаетесь смешивать краски.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...