MySQL中的“二进制字符串”是什么意思?

3
我正在阅读MySQL文档。在那里我发现UNHEX函数被描述为:

对于一个字符串参数str,UNHEX(str)将参数中的每一对字符解释为一个十六进制数,并将其转换为表示该数字的字节。返回值是一个二进制字符串。

mysql> SELECT UNHEX('4D7953514C');
        -> 'MySQL'
mysql> SELECT X'4D7953514C';
        -> 'MySQL'
mysql> SELECT UNHEX(HEX('string'));
        -> 'string'
mysql> SELECT HEX(UNHEX('1267'));
        -> '1267'

什么是“二进制字符串”?它是一个通用术语还是仅在MySQL中使用的术语?
我认为如果它是“二进制”数据,那么它不应该被称为“字符串”(字符数组)。所以我想知道什么是“二进制字符串”?它是否意味着“字节序列”?
我假设最终每种数据类型都将转换为二进制数据。MySQL中的“字符串类型”也是如此。区别“字符串”和“二进制字符串”的是,“字符字符串”在MySQL将其从二进制转换为字符字符串时具有关于要使用的编码方案和排序规则的一些信息。
所以我不太明白的是为什么UNHEX('4D7953514C')返回一个“字符字符串”'MySQL'而不是由0和1的序列表示的“二进制字符串”(0100 1101 0111 1001 0101 0011 0101 0001 0100 1100)。

在古老的C语言中,它是这样实现的:https://en.wikipedia.org/wiki/Bit_array - split
2个回答

3

“二进制字符串”一般指由0和1组成的序列。在MySQL的unhex函数中,它需要一个十六进制值的字符串作为输入,并将其转换为二进制数,结果会被表示为字符串。没有复杂的内容。结果将是一个字符串,它是从十六进制数转换为二进制数得到的。将十六进制数转换为二进制数时,每四位数字组成一个二进制数。得到的0和1序列将是结果字符串的二进制表示。


谢谢!我稍微编辑了一下我的问题。只是为了确保我理解得正确。你所说的“将被表示为字符串”,是指“字符数组”而不是“0和1的数组”吗?如果是这样,当MySQL将二进制序列转换为“字符数组”时要使用什么编码模式?为什么MySQL要将二进制序列转换为“字符数组”?为什么不直接使用字面意义上的二进制数据呢? - yaquawa
2
@yaquawa 输入为十六进制数字字符串,输出为字节字符串或者0和1的字符串。它将会被表示为一个字符串,但本质上是一个二进制数。你可以使用你喜欢的编码来改变输出。在这里,二进制字符串和字符串之间的区别在于语义。虽然在大多数情况下字符串是用户输入的结果,即文本,但在这种情况下,二进制字符串是数字进制转换的结果。字符串,在大多数情况下是文本,在这里它们是数字。我们看待它们的方式使它们不同。 - Lajos Arpad

3
正如二进制和可变二进制数据类型上的mysql手册所说,二进制字符串包含字节字符串而不是字符字符串。这意味着它们具有二进制字符集和排序规则,并且比较和排序基于值中的字节的数值。从本质上讲,它们是字节数组。

这句话是什么意思呢?我看到很多答案都用了同样的引用,即创建了一个表并添加了一些字符,如A、B、C,使用二进制类型,但他们没有将它们存储为二进制? - theMyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接