Большинство данных, имеющих характер хеш-значений * (см. Примечание ниже), хранятся в реляционной базе данных, такой как SQL Server, либо в BINARY
типе данных, либо в CHAR
тип данных.
При хранении в CHAR
, как практика , а не как реализация базы данных, они в основном хранятся как шестнадцатеричные числа. То есть они хранятся пользователем базы данных или автором кода, который использует базу данных в шестнадцатеричных , а не всама база данных .
Итак, мой вопрос: почему? Зачем хранить его только в шестнадцатеричном виде? Я хотел бы сохранить что-то подобное в поле CHAR
как base64.
Это также заняло бы намного меньше места.
Хранится как обычный текст ASCII
Например, для хранения текста «Hello» в простом ASCII внутри столбца типа CHAR
, предполагая, что строка является единственной строкой, которую я хотел сохранить, и поэтому я взял столбец фиксированной длины, потребуется CHAR(6)
(считая один CHAR
для нулевого символа).
Хранится в шестнадцатеричном формате
Сохранение этого же в шестнадцатеричном формате займет CHAR(11)
, т.е. 10 шестнадцатеричных символов плюс 1 для нулевого символа.
Хранится в нотации base64
Сохранение этого же в base64 займет всего CHAR(8)
, то есть 5 символов +1 нулевой символ, занимающий в общей сложности 6 байтов в кодировке ASCII, что равняется 48 битам, которые при преобразовании в base64 потребуют только (48/6 = 8) 8 символов для выражения, включая нулевой символ.
Итак, есть ли причина, по которой гексадесимал обозначения предпочтительнее? Что еще более важно, есть ли какой-то недостаток, который я мог бы упускать из виду при хранении данных в нотации base64?
* Данные аналогичного характера:
Данныеприрода имеет значения, дайджесты сообщений, контрольные суммы или соли (для хеш-функций или функций получения ключей на основе пароля или для ключей для алгоритмов шифрования) и т. д.