Почему 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)      |      |     |                |

Вся эта информация является текстовой, так почему они сохраняют их как двоичные файлы?

Они делают это для всех таблиц.

2 ответа

Решение

Mediawiki в начале 2011 года перешел с varchar на varbinary:

Война с варчар. Изменены все вхождения двоичного кода varchar(N) и varchar(N) в varbinary(N). varchars вызывает проблемы (ошибки "Недопустимое сочетание параметров сортировки") в базах данных MySQL с определенными конфигами, особенно в конфигурации MySQL по умолчанию.

В 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; 
Другие вопросы по тегам