在我的“现实”生活中,我将第一次使用二进制数据类型。我们需要存储某种条形码。
我的高级团队成员告诉我应该使用varbinary
,因为这是文档中的建议(我们使用 Vertica)。
我说好吧,但我的好奇心告诉我“为什么?”
我认为varbinary
或binary
类型会在选择后以不可读的文本打印在屏幕上。但这并没有发生。
所以我在 Vertica 和 SQLite 中进行了测试,他们给了我一个正确的答案。
我创建一个表并插入数据。
create table TEST_VARBINARY_2
(
id int,
va_r binary(5)
);
insert into TEST_VARBINARY_2 (id, va_r)
values (1, '11111')
这就是答案。
显然数据库可以将字符串存储在varbinary
. 所以我的问题是:为什么我们使用char/varchar
而不是varbinary/binary
?
Varbinary/binary
类型可以更有效地存储数据varchar/char
- 那么我们为什么需要varchar/char
?
在讨论这个问题时,您能给我示例或文档链接吗?
UDP 我相信在评论部分我找到了答案。
- 并非所有 RDBMS 都具有二进制类型
- 并非所有 RDBMS 都支持二进制类型的字符串函数
基本上,因为字节与字符不同。
BINARY
/VARBINARY
存储字节字符串。但这些字节可能对应于可打印的 ASCII 字符https://docs.vertica.com/24.1.x/en/sql-reference/data-types/binary-data-types-binary-and-varbinary/说:
这就是为什么你的字符串
'1111'
正常打印的原因。这些是可打印的 ASCII 字符。它们实际上是字节值 49,但当输出到文本显示器时,它们是可打印字符。这些二进制字符串类型仅存储字节。如果要存储使用除 ASCII 之外的其他编码的字符,或者使用排序规则来指导排序和字符比较,则必须使用
CHAR
/VARCHAR
以及可能的区域设置。你说你正在使用Vertica。https://docs.vertica.com/24.1.x/en/admin/about-locale/locale-and-utf-8-support/说:
(后面是字符串函数列表)
由于 UTF-8 字符的长度是可变的,因此字符串的字符长度可能与字节长度不同。字符串函数在给定/参数时
LENGTH()
报告,但在给定/参数时报告。CHARACTER_LENGTH()
CHAR
VARCHAR
OCTET_LENGTH()
BINARY
VARBINARY
排序是字符串的另一个重要属性。对二进制数据进行排序时,使用字节值进行排序。同样,如果使用二进制排序规则对字符数据进行排序。但是,如果您希望对特定区域设置进行准确排序,则字节顺序不一定是给定区域设置的正确顺序。
请阅读https://docs.vertica.com/24.1.x/en/admin/about-locale/了解有关 Vertica 中区域设置的更多信息。