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列的比较和排序逻辑都是逐字节按无符号整数值对比:
- 从左到右依次对比每个位置的字节数值;
- 只要某一位置的字节数值不同,就直接以此判定排序顺序,后续字节不再参与对比;
- 若前面所有字节都相同,再对比长度(BINARY(n)是固定长度,不足会补0,因此长度一致)。
你测试BINARY(10)时觉得排序只看首字节,正是这个逻辑:比如插入的44首字节是0x34(十进制52),7876首字节是0x37(55),因为52<55,所以44排在7876前面;如果两个值首字节相同,才会继续对比第二个字节,以此类推。
内容的提问来源于stack exchange,提问作者theMyth
相关产品推荐
相关产品推荐

