Stocker les valeurs hexadécimal en binaire de MySQL
Je pensais à la façon dont je suis le stockage des mots de passe dans ma base de données : de façon appropriée salé SHA1 chaînes dans un CHAR(40) domaine. Cependant, puisque le personnage données là-bas est en fait qu'une représentation hexadécimale de 160 bits, j'ai pensé qu'il pourrait être préférable de le stocker en tant que fichier BINAIRE(20).
CREATE TABLE users (
password BINARY(20)
/* snip */
);
INSERT INTO users (password) VALUES (UNHEX(SHA1('mypassword'));
Comme je le vois, un avantage de cette approche est qu'il réduit de moitié la taille de ce champ, mais je peux imaginer qu'il y a probablement quelques inconvénients aussi.
Quelle est votre opinion?
Vous ne économiser quelques octets par mot de passe. Est-il utile?
c'est bien ce que je me demandais. Les avantages pourraient être mince, mais quels sont les coûts?
OK, il semble y avoir un accord général, les prestations sont à la légère et n'a pas suggéré de coûts importants. Si vous avez fait le changement, les futures sauvegardes être compatible avec les dernières sauvegardes? Tout code doit-il être changé?
c'est bien ce que je me demandais. Les avantages pourraient être mince, mais quels sont les coûts?
OK, il semble y avoir un accord général, les prestations sont à la légère et n'a pas suggéré de coûts importants. Si vous avez fait le changement, les futures sauvegardes être compatible avec les dernières sauvegardes? Tout code doit-il être changé?
OriginalL'auteur nickf | 2009-11-11
Vous devez vous connecter pour publier un commentaire.
Nous avons utilisé binaire pour une tonne de différents ids dans notre base de données pour économiser de l'espace, puisque la majorité de nos données se composait de ces identifiants. Depuis il ne semble pas comme vous avez besoin pour économiser de l'espace (comme c'est juste des mots de passe, pas une autre énorme à l'échelle de l'élément), je ne vois pas de raison d'utiliser les binaires ici.
Le plus gros problème que nous avons rencontré était constamment, fâcheusement, ayant binaire données s'affichent dans la console (à chaque fois que vous tapez select * vous entendez un million de bips), et vous devez toujours faire select HEX() ou sur insertion UNHEX(), qui est une douleur.
Enfin, si vous avez de mélange et de match (par erreur) binaire et HEXADÉCIMAL/UNHEX et de se joindre à cette valeur, vous pourriez correspondre à des enregistrements vous jamais entendu.
J'aime beaucoup ton utilisation de
BINARY
pour économiser de l'espace! Pensez-vous que vous pourriez m'aider à obtenir sur la bonne voie? stackoverflow.com/questions/15539540/...OriginalL'auteur wsorenson
Voici ma répartition:
En bref, l'utilisation d'une longueur fixe de champ de texte. Il n'y a pas de gain pour le comptage des octets dans le monde actuel, en particulier lorsque le changement est facile à réaliser.
Espère que cette aide.
OriginalL'auteur Jeffrey Hulten
Le disque dur de la réduction de l'espace de stockage de vos mots de passe hachés comme binaire plutôt que varchar sont probablement négligeables. Combien d'utilisateurs vous êtes susceptible d'avoir dans ce tableau? Multipliez cela par l'espace différence entre
BINARY(20)
etVARCHAR(n)
et je pense que vous trouverez que c'est pas une économie significative. Personnellement, je préfère la représentation hexadécimale, car au moins je peux taper dans une requête si je fais une ad-hoc de l'opération au cours du développement ou de l'écriture d'une unité de test pour valider le mot de passe d'opérations connexes. Hex est un peu plus lisible que binaire si j'arrive à charger un de vidage des données dans un éditeur de texte, etc. Ma ligne de fond est que la représentation hexadécimale serait plus pratique pendant le cycle de développement.Bien sûr, vous pourriez. Il serait juste moins pratique.
OriginalL'auteur Asaph
Si vous voulez un moyen facile de stocker les binaires dans sql... vous pouvez convertir en hexadécimal avant.
Consultez cette page:
http://kekoav.com/blog/36-computers/58-uuids-as-primary-keys-in-mysql.html
Convertir en hexadécimal, enlever le "-" et de "0x" devant la chaîne. Mysql va comprendre comme un octet contenu.
Exemple:
INSERT INTO utilisateurs de DÉFINIR le mot de passe=0x1e8ef774581c102cbcfef1ab81872213
OriginalL'auteur lexmooze
C'est une vieille question, mais j'ai remarqué que personne n'a mentionné de validation des données comme un avantage d'une colonne BINAIRE. Plus précisément, il est possible de stocker une valeur non valide dans un CHAR(40) colonne à l'aide de caractères qui ne sont pas des chiffres hexadécimaux (0-9, a-f).
Vous pouvez toujours insérer la valeur incorrecte dans la colonne BINAIRE (par exemple, si vous oubliez d'appel UNHEX), mais vous n'aurez jamais à considérer la lecture d'une valeur à partir de la base de données qui n'a pas d'analyser correctement.
OriginalL'auteur benzado
Pourquoi réinventer la roue? Pourquoi ne pas utiliser
CHAR(41)
comme la table mysql.l'utilisateur' utilise? C'est bien connu, de format, de sorte que toute les futurs responsables de ne pas être gratter la tête au-dessus de votre régime spécial? Le rendre facile sur tout le monde simplement en notant que "tout comme MySQL mots de passe."OriginalL'auteur David M