MySQL类型定义 - 二进制类型

本文介绍了MySQL中的二进制数据类型,包括BINARY、VARBINARY、BIT和BLOB等,强调它们的区别和用途。BINARY和VARBINARY有固定和可变长度,用于存储短二进制数据,BIT类型存储比特位数据,BLOB类型则适用于长二进制数据,如图片和文件。在使用中,应根据数据长度和查询效率选择合适类型。

二进制类型

二进制数据和文本数据在mysql 中的最大区别在于:

  • 二进制类型存储原始的二进制数据(如图片,视频,exe文件等)。文本类型(TEXT)用来存储字符字符串(如由英文字符、中文字符或其它语言字符组成的字符串)。
  • 二进制类型没有字符集,并且排序和比较基于列值字节的数值。而TEXT类型有字符集,并且根据字符集的校对规则对值进行排序和比较。

二进制类型是存储二进制数据的数据类型,包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。二进制类型之间的对比如下表所示。
在这里插入图片描述

1. BINARY和VARBINARY类型

BINARY类型和VARBINARY类型都是在创建表时指定最大长度,其基本形式如下:
类型 (M)
其中,“字符串类型”参数指定数据类型为BINARY类型还是VARBINARY类型;M参数指定该二进制数的最大字节长度为M。这与CHAR类型和VARCHAR类型相似。例如,BINARY(10)就是指数据类型为BINARY类型,其最大长度为10。

  • BINARY类型的长度是固定的,在创建表时就指定了,不足最大长度的空间由″\0″补全。例如,BINARY(50)就是指定BINARY类型的长度为50。
  • VARBINARY类型的长度是可变的,在创建表时指定了最大的长度,其长度可以在0到最大长度之间,在这个最大值范围内使用多少就分配多少。
mysql> use test;   #选择数据库test 
mysql> create table bin_exmaple(e_bin  binary(10),e_varbin varbinary(10)); #创建表 
mysql> insert into bin_exmaple values( 'ab','ab'); #插入记录,可以是普通字符串
mysql> insert into bin_exmaple values( b'0110000101100010',b'0110000101100010'); #插入记录,可以是二进制,与上例等同
mysql> select * from bin_exmaple ;  #以十六进制的方式显示 
  1. 创建一个 bin_example 表
    在这里插入图片描述
  2. 插入数据
    在这里插入图片描述
     
     

 

BIT类型

BIT类型在创建表时指定最大长度,其基本形式如下:

 BIT(M)

其中,“M”指定该二进制数的最大存储长度为M,M的最大值为64。例如,BIT(4)就是指数据类型为BIT类型,长度为4。若字段的类型BIT(4)存储的数据是0~15,因为变成二进制之后15的值为1111,则其长度为4。如果插入的值为16,其二进制数为10000,长度为5,超过了最大长度,因此大于16的数是不能插入BIT(4)类型字段中的。

操作要点:

  • 插入数据时,使用 b’位串’的方式插入相应值!
  • 查询时,可以使用 bin() 、oct() 、hex() 函数讲字段的值转成相应的二进制、八进制和十六进制.
mysql> use test;   #选择数据库test 
mysql> create table bit_example (b_bit bit(8) ); #创建表 
mysql> insert into bit_example values( b'10110111' ); #插入记录,可以是二进制位
mysql> insert into bit_example values( 'a' ); #插入记录,可以是字符,但不能超出字节长度
mysql> select bin(b) from bit_example ;  #以二进制的方式显示字段值 
  1. 创建表
    在这里插入图片描述
  2. 插入数据
    在这里插入图片描述
  3. 二进制方式显示
    在这里插入图片描述
  4. 插入高位的0会被自动省略掉
    在这里插入图片描述

 
 

BLOB类型

在这里插入图片描述
1.以上各类型无须指定长度!
2.允许的长度是指实际存储的字节数,不用考虑字符编码。
创建 blob_example 表, 然后插入数据
在这里插入图片描述
在这里插入图片描述

 
 
 

实战建议

  • 1、 binary长度固定, 即每条数据占用等长字节空间;保存长度不超过255字节的二进制数据;
  • 2、 varbinary可变长度,可以设置最大长度,最大长度65535;适合用在长度可变的二进制数据;
  • 3、 blob不设置长度, 当不知道属性的最大长度时,适合用blob, 能用varbinary的地方不用blob;
  • 4、 如果都可以选择,按照查询速度: binary最快, varbinary次之,blob最慢。
<think>嗯,用户现在问的是MySQL中字符串类型二进制字符串的区别和用法,还有示例。我需要先理清楚这两者的不同点,然后给出具体的例子。让我先回忆一下MySQL的数据类型。 首先,字符串类型通常指的是CHAR、VARCHAR、TEXT这些,它们用来存储文本数据,比如字母、数字、符号等。而二进制字符串类型包括BINARY、VARBINARY、BLOB,这些是用来存储二进制数据的,比如图片、文件之类的。根据引用[2],二进制字符串可能包含不可打印的字符,而文本字符串是可打印的。所以在存储和传输时处理方式不同,转换时需要特别处理。 然后,用户需要知道它们的使用区别。比如排序规则,文本字符串会根据字符集排序,而二进制是按字节值排序。还有比较时的区别,文本可能忽略大小写,二进制则会区分。引用[3]提到BLOB类型可以存储大对象,比如图片,并且操作方式和普通字符串类似,用INSERT、SELECT等语句。比如创建表的时候用BLOB类型,插入时用十六进制或者二进制数据。 接下来是示例部分。需要分别展示字符串和二进制字符串的建表、插入和查询。比如创建一个用户表,用VARCHAR存用户名,另一个图片表用BLOB存图片数据。插入的时候,文本可以直接用字符串,二进制可以用十六进制或者LOAD_FILE函数。查询的时候,文本可以直接显示,二进制可能需要用HEX函数转换查看。 另外,注意事项部分要提到字符集影响、存储效率,比如BINARY可能会填充空格,而VARBINARY不会。还有索引的使用,二进制可能需要更长的索引键长度。引用[3]中的示例代码可以用来参考如何操作BLOB类型的数据。 最后,用户可能需要相关的问题,比如如何选择类型,存储二进制数据的方法,或者比较规则的不同。这些可以作为相关问题提出。 现在要确保回答结构清晰,分点说明区别,用法,示例,注意事项。还要注意使用正确的LaTeX格式,比如变量用$...$,独立公式用$$...$$,不过这里可能用不上太多数学公式,但如果有的话要正确应用。引用部分要自然地标注,比如在比较规则的地方引用[2],在示例部分引用[3]。 检查是否有遗漏的点,比如字符集的影响,存储空间的区别,或者性能方面的考虑。例如,二进制比较可能更快,因为不需要考虑字符集规则。另外,插入二进制数据时的方法,比如使用0x前缀或者X''语法,或者从文件加载。 确保示例代码正确,比如创建表、插入数据、查询的SQL语句。可能需要指出在插入二进制数据时的不同方法,以及查询时的处理方式。同时,注意中文字符的正确使用,避免乱码。 最后,生成的相关问题要围绕用户可能关心的后续内容,比如类型选择、优化存储、比较规则等。</think>### MySQL字符串类型二进制字符串的对比解析 #### 一、核心区别 1. **数据存储方式** - 文本字符串类型($CHAR$、$VARCHAR$、$TEXT$)存储可打印字符(字母、数字、符号),受字符集(如UTF-8)影响[^2] - 二进制字符串类型($BINARY$、$VARBINARY$、$BLOB$)存储原始字节数据(如图片、加密结果),无字符集限制[^3] 2. **比较规则** - 文本字符串按字符集规则比较(如忽略大小写) - 二进制字符串按字节值逐位比较(严格区分大小写) ```sql -- 文本比较可能返回相等 SELECT 'A' = 'a'; -- 结果为1(依赖字符集配置) -- 二进制比较必然区分大小写 SELECT BINARY 'A' = BINARY 'a'; -- 结果为0 ``` 3. **填充行为** - $CHAR$类型用空格填充至定义长度 - $BINARY$类型用0x00字节填充[^3] #### 二、使用场景对比 | 类型 | 典型场景 | 示例数据 | |---------------|----------------------------|-------------------------| | VARCHAR | 用户名、地址 | '张三', '北京市朝阳区' | | BLOB | 图片/文件存储 | 图片二进制流 | | VARBINARY | 加密数据 | AES_ENCRYPT('密码','密钥') | | TEXT | 长文本内容 | 文章正文 | #### 三、操作示例 1. **建表示范** ```sql -- 文本字符串表 CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50) CHARACTER SET utf8mb4, profile TEXT ); -- 二进制字符串表 CREATE TABLE files ( id INT PRIMARY KEY, file_data BLOB, hash BINARY(32) -- 存储SHA256哈希值 ); ``` 2. **数据插入对比** ```sql -- 插入文本数据 INSERT INTO users VALUES (1, 'admin', '系统管理员'); -- 插入二进制数据(三种方式) INSERT INTO files VALUES (1, 0x89504E470D0A1A0A..., UNHEX(SHA2('secret',256))), -- 十六进制字面量 (2, LOAD_FILE('/tmp/image.jpg'), NULL); -- 从文件加载 ``` 3. **查询差异** ```sql -- 文本查询直接显示 SELECT username FROM users WHERE id=1; -- 返回'admin' -- 二进制查询需转换显示 SELECT HEX(hash) FROM files WHERE id=1; -- 返回十六进制字符串 ``` #### 四、关键注意事项 1. **字符集影响** 文本字符串的存储长度受字符集影响(如UTF-8中文字符占3字节),而二进制类型长度固定[^2] 2. **索引效率** 二进制列的索引效率通常高于文本列,但$BLOB/TEXT$类型需指定前缀长度: ```sql CREATE INDEX idx_profile ON users(profile(100)); -- 前100字符索引 ``` 3. **隐式转换风险** 混合使用可能触发类型转换: ```sql SELECT * FROM files WHERE hash = 'abc'; -- 这里'abc'会被转为二进制 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值