2013-09-27 18 views
6

Mam aplikację PHP, która przechowuje wszystkie konta niezależnie od tego, czy są aktywne, czy nie w jednej tabeli. Tabela ma kolumnę o nazwie "active", która ma wartość NULL, co oznacza, że ​​konto jest aktywne lub zawiera skrót MD5, co oznacza, że ​​konto jest nieaktywne.Najlepszy typ danych MySQL do przechowywania skrótu MD5 lub NULL

Zgodnie z Best practices for efficiently storing md5 hashes in mysql, jeśli kolumna zawsze zawiera skrót MD5 i nigdy nie ma wartości NULL, preferowane jest BINARY (16), a CHAR (32) jest następnym najlepszym wyborem. Ponieważ większość moich kont jest aktywnych, a zatem większość wartości kolumny będzie miała wartość NULL, czy lepiej będzie użyć innego typu danych, na przykład VARCHAR (32)?

+1

Tak, możesz .. 'VARCHAR (32)' jest preferowany. –

+0

możliwy duplikat [MySQL: jakiego rodzaju danych użyć do hashowanego pola hasła i jakiej długości?] (Http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed- password-field-and-what-length) –

Odpowiedz

12

Nie ma sensu używać VARCHAR. Skróty MD5 są zawsze 128-bitowe, więc CHAR (32) przechowuje łańcuch cyfr szesnastkowych, lub BINARY (16) przechowuje ciąg bajtów po UNHEX() w postaci cyfr heksadecymalnych.

Używanie NULL jest niezależne od wyboru typu danych. MySQL może przechowywać NULL zamiast ciągu, CHAR lub VARCHAR. W rzeczywistości, w domyślnym formacie wiersza InnoDB, MySQL nie przechowuje NULL w ogóle, nie przechowuje nic dla kolumn, które są NULL.


odniesienia: http://dev.mysql.com/doc/internals/en/innodb-field-contents.html

  • Przydatne Uwagi o wartości null:

    W trzecim rzędzie, włożeniu null w Pole2 i FIELD3. Dlatego w Offsetach Startu Pola górny bit jest włączony dla tych pól (wartości są 94 szesnastkowe, 94 szesnastkowe, zamiast 14 szesnastkowych, 14 szesnastkowych). A wiersz jest krótszy, ponieważ NULL nie zajmują miejsca.

(Kopalnia nacisk)

+0

Dzięki Bill, Więc w oparciu o twoją odpowiedź, rozumiem, że jeśli użyję CHAR (32) lub BINARY (16), a zapisana wartość jest NULL, wtedy moje obciążenie nie jest większe niż przy użyciu VARCHAR (32). Dzięki i mam nadzieję, że masz rację! – user1032531

+0

+1 rachunek i @ użytkownik1032531 Bill oznacza, że ​​powinieneś użyć CHAR (32) lub BINARIUM (16). i tak, twój koszt będzie większy, gdy użyjesz VARCHAR, ponieważ MySQL potrzebuje zapisać dwa krótkie szorty, aby wiedzieć, jak duży jest twój VARCHAR.Dokładny klucz wyszukiwania powinien być szybszy w kolumnach CHAR podczas definiowania zestawu znaków ASCII_bin. –

0

W kodzie źródłowym MySQL w ciągach plików/ctype-bin.c zdefiniowano typ BINARY.

Wygląda jak domyślny zestaw znaków bazujący na C ascii, konwertowany na plik binarny. To powinno być szybsze niż CHAR (32) z zestawem znaków ASCII_bin.

powodu konieczna jest mniej czasu do zapisu/odczytu binarnego i zajmuje mniej miejsca na dysku w indeksach i pamięci, a ponieważ CHAR (32) typ danych wynosi 16 bajty większy

Jeśli chcesz skorzystać z tej należy użyć tego kod php

<?php 
    md5 ("password", true); // true returns the binary what is 16 bytes long MySQl BINARY(16) 
?> 
-5

Można użyć md5 php function(); Jest bardziej wydajny i jeśli ktokolwiek może złapać dane podczas wysyłania do bazy danych, będzie to już szyfrowane.

+2

Jak to odpowiada na pytanie? – mistika

Powiązane problemy