为啥 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 中:
我认为最大的区别仅在于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
所以在大小上它们是相同的,但还有一个不同之处。如果您检查列规范,您会看到 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 有啥好处? [关闭]