为什么varbinary而不是varchar

时间:2012-11-15 08:20:15

标签: mysql sql sql-server database database-design

  

可能重复:
  What is the advantage of using varbinary over varchar here?

请看一下这张表:

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 个答案:

答案 0 :(得分:16)

Mediawiki在early 2011中从varchar更改为varbinary:

  

对varchar进行战争。更改了所有出现的varchar(N)和varchar(N)   二进制到varbinary(N)。 varchars导致问题(“无效混合   大多数情况下,在具有某些配置的MySQL数据库上的排序“错误”   特别是默认的MySQL配置。

答案 1 :(得分:6)

在MSSQL中:

我认为差异仅在nvarcharvarbinary之间。

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

varcharvarbinary完全相同:来自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;