【问题标题】:MySQL "binary" vs "char character set binary"MySQL“二进制”与“char 字符集二进制”
【发布时间】:2013-03-11 09:04:21
【问题描述】:

binary(10)char(10)character set binary 有什么区别?

还有varbinary(10)varchar(10)character set binary

它们在所有 MySQL 引擎中是同义词吗?

有什么需要注意的地方吗?

【问题讨论】:

    标签: mysql debugging storage specifications column-types


    【解决方案1】:

    没有区别。

    但是,如果您要存储字符串,则需要注意。

    如果您只想存储字节数组或其他二进制数据,例如流或文件,请使用二进制类型,因为这就是它们的用途。

    引用自MySQL manual

    CHARVARCHAR的定义中使用CHARACTER SET binary, 或TEXT 列导致该列被视为二进制数据类型。 例如,下面的定义对是等价的:

    CHAR(10) CHARACTER SET binary
    BINARY(10)
    
    VARCHAR(10) CHARACTER SET binary
    VARBINARY(10)
    
    TEXT CHARACTER SET binary
    BLOB
    

    所以,技术上没有区别。

    但是,在存储字符串时,必须使用字符集将其从字符串转换为字节值。决定是在 MySQL 服务器之前自己执行此操作,还是让 MySQL 为您执行此操作。 MySQL 将通过使用 BIN 字符集将字符串转换为 BINARY 来执行。

    如果您想以另一种格式存储编码,假设您有一个业务需求,即您必须每个字符使用 4 个字节(默认情况下 MySQL 不这样做),然后您可以使用 CHARACTER SET BINARY文本列并自己执行字符集编码。

    还值得阅读 MySQL 手册中的 The BINARY and VARBINARY Types,因为它详细介绍了重要信息,例如填充。

    总结: 没有技术差异,因为一个是另一个的同义词。在我看来,将二进制字符串存储在通常使用CHARACTER SET BINARY 保存字符串的数据类型中并将字节数组/流等存储在BINARY 字段中是合乎逻辑的,这些字段不能通过通过字符集转换数据来表示.

    【讨论】:

    • 我正在存储字节数组。如果这两个选项是同义词,你为什么说“使用二进制类型,因为这是它的设计目的”char character set binary 不也是为字节数组设计的吗?
    • @Pacerier 这对我来说确实是不好的措辞(我会在我的回答中更清楚地说明这一点),字符集二进制是二进制的同义词,所以从技术上讲没有区别。 IMO 在 BINARY 中存储二进制流(不能由字符集和排序规则表示)更容易理解,如果您正在执行自己的字符编码,则将其存储在具有 CHARACTER SET BINARY
    • @Ic,顺便说一句,您知道这种行为是官方,还是引擎仍然允许自己实现?
    • @Pacerier 这是一个很好的问题,老实说我不知道​​。但是,我可以为您指明正确的方向。 MySQL 在创建表时创建 .frm 文件,然后通过 API 将此 .frm 传递给存储引擎 - 如果 .frm 文件没有差异(当创建具有不同字段值的两个表时),则存储引擎获胜不知道有什么区别,也无法区别对待。这“可能”在未来的版本中发生变化,不应依赖。
    猜你喜欢
    • 2011-09-21
    • 2010-10-04
    • 1970-01-01
    • 2012-08-27
    • 2010-12-06
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多