31

请看一下这张表:

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)      |      |     |                |

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

他们对所有桌子都这样做。

4

2 回答 2

19

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

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

于 2012-11-15T12:20:01.033 回答
7

在 MSSQL 中:

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

因为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; 
于 2012-11-15T08:55:23.057 回答