为什么要使用 varbinary 而不是 varchar?

32
请看这张表格:
请查看此链接: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
这里讨论了使用varbinary比varchar占用更少的空间的优势。 - threenplusone
@threenplusone - 这是在特定谜题的背景下。它不是通过将字符串1.2.3填充到int的最大长度来将其转换为'100000000011000000000210000000003',而是使用更紧凑的二进制表示0x020000000102000000020200000003 - Martin Smith
2个回答

19

Mediawiki在2011年初从varchar更改为varbinary:

对于varchar的战争。将所有varchar(N)和varchar(N)二进制出现的地方更改为varbinary(N)。在具有某些配置的MySQL数据库上,varchar会引起问题(“不同字符集的无效混合”错误),尤其是默认的MySQL配置。


19
他们似乎在错误的方面解决了问题。他们消除了症状,而不是修复潜在的排序问题。 - usr

8
在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。
所以它们的大小是相同的,但有一个其他的区别。如果您检查列规范,您会发现,二进制变量(当然)没有排序和字符集,因此可以轻松地使用来自不同类型编码和字符集的值。
SELECT 
  *
FROM   
  INFORMATION_SCHEMA.COLUMNS 
WHERE   
  TABLE_NAME = 'Test' 
ORDER BY 
  ORDINAL_POSITION ASC; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接