Почему varbinary вместо varchar
Возможный дубликат:
В чем преимущество использования varbinary над varchar здесь?
Пожалуйста, взгляните на эту таблицу:
http://www.mediawiki.org/wiki/Manual:Logging_table
Как вы видите, википедия использует varbinary вместо varchar:
| log_type | **varbinary**(32) | NO | MUL | |
| log_action | **varbinary**(32) | NO | | |
| log_timestamp | **binary**(14) | NO | MUL | 19700101000000 |
| log_user | int(10) unsigned | NO | MUL | 0 |
| log_user_text | **varbinary**(255) | | | |
Все эти данные являются текстовыми, поэтому почему они сохраняют их как двоичные?
Они делают это для всех таблиц.
Ответы
Ответ 1
Mediawiki изменена с varchar на varbinary в начало 2011 года:
Война на варчаре. Изменены все вхождения varchar (N) и varchar (N) двоичный для varbinary (N). varchars вызывают проблемы ( "Недопустимое сочетание коллажации" ) в базах данных MySQL с определенными конфигурациями, большинство в частности конфигурацию MySQL по умолчанию.
Ответ 2
В MSSQL:
Я думаю, что большая разница только между nvarchar
и varbinary
.
Поскольку nvarchar
хранит 2 байта для каждого символа вместо 1 байта.
varchar
делает то же самое, что и varbinary
: из MSDN:
Размер хранилища - фактическая длина введенных данных + 2 байта " для обоих.
Разница здесь в varbinary. Вводимые данные могут быть равны 0 байтов в длину.
Вот небольшой пример:
CREATE TABLE Test (textData varchar(255), binaryData varbinary(255))
INSERT INTO Test
VALUES('This is an example.', CONVERT(varbinary(255),'This is an example.',0))
INSERT INTO Test
VALUES('ÜŰÚÁÉÍä', CONVERT(varbinary(255),'ÜŰÚÁÉÍä',0))
Что вы можете использовать здесь: DATALENGTH:
SELECT datalength(TextData), datalength(binaryData) FROM test
В результате получается 19 - 19 и 7 - 7
Значит, они одинаковы, НО есть другая разница. Если вы проверите спецификации столбца, вы увидите, что varbinary (конечно) не имеет сортировки и набора символов, поэтому он может легко использовать значения из разных типов кодирования и набора символов.
SELECT
*
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'Test'
ORDER BY
ORDINAL_POSITION ASC;