为啥 varbinary 而不是 varchar [重复]

Posted

技术标签:

【中文标题】为啥 varbinary 而不是 varchar [重复]【英文标题】:why varbinary instead of varchar [duplicate]为什么 varbinary 而不是 varchar [重复] 【发布时间】:2012-11-03 19:52:50 【问题描述】:

请看一下这张表:

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

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

他们对所有表都这样做。

【问题讨论】:

Here 谈到 varbinary 使用的空间比 varchar 少。 @threenplusone - 这是在特定谜题的背景下。它不是通过将每个组件填充到 int 的最大长度来将字符串 1.2.3 转换为 '100000000011000000000210000000003',而是使用更紧凑的二进制表示 0x020000000102000000020200000003 【参考方案1】:

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

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

【讨论】:

看起来他们解决了错误的问题。他们消除了症状,而不是解决潜在的排序规则问题。【参考方案2】:

在 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; 

【讨论】:

以上是关于为啥 varbinary 而不是 varchar [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 UTF-8 varbinary(max) 转换为 varchar(max)

为啥 sp_executesql 需要 ntext/nchar/nvarchar 而不是 text/char/varchar?

将 varchar/varbinary 的整个表列转换为 xml

使用 VARCHAR(max)、NVARCHAR(max) 和 VARBINARY(max) 代替 TEXT、NTEXT 和 IMAGE 有啥好处? [关闭]

数据库:CHAR,VARCHAR,TEXT,ENUM ,SET,BINARY,VARBINARY 列的完整性约束

From data type varchar to varbinary is not allowed