web-dev-qa-db-fra.com

Comment puis-je stocker une couleur dans un champ de base de données?

Je dois stocker les couleurs dans la base de données.

Comment puis-je stocker une couleur de la meilleure manière dans le champ de la base de données?, Par nom de couleur ou autre chose ??

43
Dhana

Si c'est pour une page HTML, le stockage de la balise #RRGGBB sous forme de chaîne est probablement suffisant.

Si c'est pour .NET, il prend en charge la construction d'une couleur à partir de sa valeur ARGB

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

int x = c.ToArgb();

vous pouvez donc simplement stocker cet int.

37
Eoin Campbell

La valeur de couleur serait probablement la meilleure, par ex. #FFFFFF ou # FF0000

14
Jimmeh

Le format de stockage idéal dépend de la façon dont vous prévoyez d'utiliser la base de données.

La solution la plus simple consiste bien sûr à tout stocker sous la forme d'une chaîne hexadécimale de 6 octets ASCII de la couleur RVB, sans prise en charge d'aucun autre format). si vous souhaitez ultérieurement prendre en charge des formats supplémentaires.

Pour la lisibilité, la flexibilité et la facilité d'accès, utiliser une chaîne simple est une bonne idée. La différence d'espace de stockage entre une chaîne de couleur hexadécimale et un entier brut est négligeable dans la plupart des cas. Pour augmenter la vitesse, vous pouvez définir le champ de couleur à indexer. Et pour plus de flexibilité, vous pouvez ajouter une ou plusieurs des fonctionnalités suivantes:

  • Supposons la couleur contextuelle par défaut si NULL, vide ou invalide
  • Accepter un octet alpha de fin facultatif 00-FF, en supposant que FF (opaque) s'il est omis
  • Acceptez la syntaxe complète (AABBCC) et raccourcie (ABC), qui est la moitié de la taille, plus rapide à taper et prise en charge par CSS
  • Prend en charge un chiffre # facultatif, ce qui est courant
  • Prend en charge les chaînes brutes, pour contenir tout ce que CSS prend en charge comme "rgba (255,255,255,1)" ou "red"
  • Prise en charge de chaînes de mode de couleur personnalisées telles que "cmyk (), hsv (), hsl (), lab ()", etc.
  • Supposons que les chaînes hexadécimales RVB (A) commencent par un # ou si la longueur est 3, 4, 6 ou 8 et contient uniquement [0-9A-Fa-f]

Pour optimiser la vitesse de recherche et de tri, ainsi que l'utilisation du disque, le stockage en tant qu'entier non signé est la solution. En effet, un seul numéro est plus rapide à rechercher qu'une chaîne de caractères, peut être stocké en interne aussi petit que quelques bits, et vous pouvez toujours filtrer par canaux de couleur dans vos requêtes à l'aide de FromArgb() et de fonctions similaires . L'inconvénient est que votre code doit ensuite constamment convertir les choses dans les deux sens pour chaque champ de couleur dans chaque requête, ce qui peut en fait compenser tout gain de vitesse de la base de données.

ne approche hybride peut être utile d'explorer. Par exemple, considérez un tableau de toutes les valeurs RVB 8 bits par canal possibles, avec des champs composés de choses comme id, rgbhex, cssname, cmyk, hsl, hsv, lab, rgb, etc. Vous devez automatiser le création d'un tel tableau car il serait si volumineux (16777216 entrées). Cela ajouterait plus de 16 Mo à votre table, mais l'avantage de cette solution est que toutes vos valeurs de couleur ne seraient qu'un seul champ d'identifiant entier lié avec une clé étrangère à la table de recherche des couleurs. Tri et recherche rapides, toutes les données de couleur dont vous avez besoin sans aucune conversion et extrêmement extensibles. Vous pouvez également conserver la table dans son propre fichier de base de données afin qu'elle soit partagée par toute autre base de données ou script de votre application. Certes, cette solution est exagérée dans la plupart des cas.

13
Beejor

Stockez une couleur sous forme d'entier 24 ou 32 bits, comme en HTML/CSS, c'est-à-dire # FF00CC, mais converti en un entier et non en une chaîne.

Les entiers prendront moins d'espace que les chaînes (en particulier les VCHAR).

13
rjstelling

Stockez-le en tant qu'int

Utilisez ToArgb et FromArgb pour définir et obtenir les valeurs.

4
Geoff Appleford

Je pense que cela dépend. Si vous avez juste besoin de stocker la couleur, la notation hexadécimale devrait convenir. Si vous devez effectuer des requêtes sur des canaux de couleur spécifiques, vous souhaitez des champs en petits caractères pour chaque canal de couleur (que ce soit RGB, ARGB, CYMK, etc.).

Donc, pour un stockage simple, restez simple. Si vous devez effectuer une analyse, vous devrez envisager d'autres options en fonction de votre domaine problématique.

3
Ryan Emerle

Je suggère d'avoir une table de recherche de couleurs à 3 colonnes:

ID int; Nom varchar (40) null; ColorVal char (8) ou int (selon la façon dont vous représentez les couleurs)

Pour les couleurs sans nom, laissez simplement le champ de nom nul

1
C. Ross

Dans quel format souhaitez-vous stocker les couleurs? CMTK, RVB, Pantone? Cela aide à savoir ... le format hexadécimal strictement #RGB fonctionne très bien si c'est pour les couleurs Web ou une application, mais pas si bon si vous essayez de mélanger des peintures.

0
Christopher Klein

Pour enregistrer la couleur dans la base de données:

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

et aussi pour le récupérer de l'utilisation de la base de données:

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

Je le stocke comme char (9).

  • Inclus le signe "#" pour que je n'ai pas à l'ajouter dans le code et à l'utiliser immédiatement
  • Caractère normal au lieu de nchar
  • Stocke la transparence
0
Jowen

J'opterais pour la notation hexadécimale si les couleurs sont limitées aux couleurs Web.

Ainsi, par exemple # 0000FF pour le bleu.

Plus d'informations ici: http://en.wikipedia.org/wiki/Web_colors

0
Gerrie Schenck