为什么varbinary而不是varchar

use*_*084 25 mysql sql database sql-server database-design

可能重复:
在这里使用varbinary over 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)      |      |     |                |
Run Code Online (Sandbox Code Playgroud)

所有这些信息都是文本,为什么他们将它们保存为二进制?

他们为所有表格执行此操作.

Sjo*_*erd 16

Mediawiki在2011年初从varchar变为varbinary :

对varchar的战争.将所有出现的varchar(N)和varchar(N)二进制更改为varbinary(N).varchars在具有某些配置的MySQL数据库上导致问题("无效的排序混合"错误),最明显的是默认的MySQL配置.

  • 看起来他们把问题解决了错误的一面.他们使症状沉默,而不是修复潜在的整理问题. (16认同)

And*_*ttó 6

在MSSQL中:

我认为最大的区别仅在于nvarchar和之间varbinary.

因为nvarchar每个字符存储2个字节而不是1个字节.

varcharvarbinary与MSDN 一样:来自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))
Run Code Online (Sandbox Code Playgroud)

你可以在这里使用的是DATALENGTH函数:

SELECT datalength(TextData), datalength(binaryData) FROM test
Run Code Online (Sandbox Code Playgroud)

结果是19 - 19和7 - 7

所以在尺寸上他们是相同的,但还有另一个区别.如果检查列规范,可以看到varbinary(当然)没有排序规则和字符集,因此它可以帮助您轻松使用不同类型的编码和字符集中的值.

SELECT 
  *
FROM   
  INFORMATION_SCHEMA.COLUMNS 
WHERE   
  TABLE_NAME = 'Test' 
ORDER BY 
  ORDINAL_POSITION ASC; 
Run Code Online (Sandbox Code Playgroud)