Как сохранить цвет в поле базы данных?
Мне нужно хранить цвета в базе данных.
Как я могу сохранить цвет наилучшим образом в поле базы данных?, по имени цвета или что-то еще?
Ответы
Ответ 1
Если его для HTML-страницы достаточно хранить тэг #RRGGBB в виде строки.
Если это для .NET, он поддерживает построение цвета с его значением ARGB
System.Drawing.Color c = System.Drawing.Color.FromArgb(int);
int x = c.ToArgb();
чтобы вы могли просто сохранить этот int.
Ответ 2
Вероятно, значение цвета было бы лучшим, например. #FFFFFF или # FF0000
Ответ 3
Сохраняйте цвет как целое число 24 или 32 бита, например, в HTML/CSS, то есть # FF00CC, но преобразуется в целое число, а не в строку.
Целые числа занимают меньше места, чем строки (особенно VCHAR).
Ответ 4
Идеальный формат хранения зависит от того, как вы планируете использовать базу данных.
Простейшее решение, конечно, просто хранит все как шестибайтную шестнадцатеричную строку ASCII цвета RGB без поддержки какого-либо другого формата. Хотя вы можете столкнуться с проблемами, если позже захотите поддерживать дополнительные форматы.
Для удобства чтения, гибкости и простоты доступа, используя простую строку, это хорошая идея. Разница в пространстве хранения между шестнадцатеричной цветовой строкой и необработанным целым в большинстве случаев незначительна. Для повышения скорости вы можете установить поле цвета для индексации. И для гибкости вы можете добавить одну или несколько из следующих функций:
- Предположим, что контекстный цвет по умолчанию, если 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()
и подобных функций. Недостатком является ваш код, тогда вам нужно постоянно преобразовывать вещи взад и вперед для каждого поля цвета в каждом запросе, что может фактически компенсировать любое увеличение скорости базы данных.
Возможно, стоит изучить гибридный подход. Например, рассмотрим таблицу всех возможных значений RGB в 8 бит на канал, с полями, состоящими из таких элементов, как id, rgbhex, cssname, cmyk, hsl, hsv, lab, rgb и т.д. Вам нужно будет автоматизировать создание такой таблицы, поскольку она была бы такой большой (16777216 записей). Это добавит более 16 МБ к вашей таблице, но преимущество этого решения в том, что все ваши значения цвета будут всего лишь одним целым полем id, связанным с внешним ключом, в таблицу поиска цветов. Быстрые сортировки и поиск, любые цветовые данные, которые вам нужны без какого-либо преобразования, и чрезвычайно расширяемы. Вы также можете сохранить таблицу в своем собственном файле базы данных для совместного использования любой другой базой данных или script в своем приложении. По общему признанию, это решение в большинстве случаев является излишним.
Ответ 5
Сохраните его как int
Используйте ToArgb и FromArgb для установки и получения значений.
Ответ 6
Я думаю, это зависит. Если вам просто нужно сохранить цвет, то шестнадцатеричное обозначение должно быть прекрасным. Если вам нужно выполнить запросы к конкретным цветовым каналам, тогда вам понадобятся небольшие поля для каждого цветного канала (будь то RGB, ARGB, CYMK и т.д.).
Итак, для простого хранения, прост. Если вам нужно выполнить анализ, вам нужно будет рассмотреть альтернативные варианты, которые продиктованы вашей проблемной областью.
Ответ 7
Я предлагаю иметь таблицу поиска по 3 столбцам:
ID int;
Имя varchar (40) null;
ColorVal char (8) или int (в зависимости от того, как вы представляете цвета)
Для неназванных цветов просто оставьте поле имени null
Ответ 8
Я бы пошел на шестнадцатеричную нотацию, если цвета ограничены цветами в Интернете.
Так например # 0000FF для синего.
Дополнительная информация здесь: http://en.wikipedia.org/wiki/Web_colors
Ответ 9
В каком формате вы хотите хранить цвета? CMTK, RGB, Pantone?
Это как-то помогает узнать... строковый формат #RGB hex отлично работает, если он предназначен для веб-цветов или приложений, но не очень хорош, если вы пытаетесь смешивать краски.
Ответ 10
Я храню его как char (9).
- Включен знак '#', чтобы мне не пришлось добавлять его в код и использовать его немедленно
- Обычный char вместо nchar
- Сохраняет прозрачность
Ответ 11
Сохранить цвет в базе данных:
//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)
Ответ 12
Почему бы вам не использовать оба? Структура таблицы будет Int ARGB для ключа и varchar для имени.
ARGB (Key), Name
FFFFFFFF ,Black
FF000000 ,White