You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB中Binary数据类型的存储、排序及字符适配问题问询

MariaDB BINARY类型字节数值与排序规则详解

问题1:字节的数值具体指什么?是否与ASCII字符的编码值相同?

字节的数值就是该字节对应的无符号十进制整数值(范围0-255),本质是字节二进制位转换后的十进制结果。
对于ASCII字符来说,若连接字符集是ASCII或UTF-8(单字节兼容ASCII),插入BINARY列时存储的字节值就是该字符的ASCII编码值——比如'0'对应48、'A'对应65、'a'对应97,这和你测试的排序结果完全匹配:数字(48-57)<大写字母(65-90)<小写字母(97-122),排序逻辑就是按字节数值从小到大排列。

问题2:向Binary类型中插入字符'A'时,其编码与存储方式是怎样的?在TablePlus客户端中无法看到二进制存储形式。

插入字符'A'时,MariaDB会先根据当前连接的字符集,将字符转换为对应的字节序列,再存入BINARY列:

  • 若连接用ASCII或UTF-8编码,'A'会被转换成单字节0x41(十进制65),直接存入BINARY(1)列;
  • 若字符集是多字节编码(比如GBK),单字符可能对应多个字节,但BINARY(n)会严格按n字节长度存储,超出长度会报错,不足则补0填充。

TablePlus默认会把字节序列尝试解析为字符显示,因此看不到原始二进制。要查看真实存储内容,可以用HEX()函数:

SELECT col, HEX(col) FROM BinaryEg1;

执行后会显示'A'对应的十六进制值41,这就是实际存储的字节。

问题3:若在该类型中同时存储字符与二进制图像等数据,字节字符串的数值如何确定?

不管是字符转换来的字节,还是图像、文件等原始二进制数据,BINARY列的比较和排序逻辑都是逐字节按无符号整数值对比:

  1. 从左到右依次对比每个位置的字节数值;
  2. 只要某一位置的字节数值不同,就直接以此判定排序顺序,后续字节不再参与对比;
  3. 若前面所有字节都相同,再对比长度(BINARY(n)是固定长度,不足会补0,因此长度一致)。

你测试BINARY(10)时觉得排序只看首字节,正是这个逻辑:比如插入的44首字节是0x34(十进制52),7876首字节是0x37(55),因为52<55,所以44排在7876前面;如果两个值首字节相同,才会继续对比第二个字节,以此类推。


内容的提问来源于stack exchange,提问作者theMyth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:05:21