MariaDB LENGTH() vs LENGTHB(): 有什么区别?
从版本 10.3.1 开始,MariaDB 就包含了函数和函数。LENGTH()``LENGTHB()
第二个在名称的末尾有一个。所以它有点像和,除了没有.B``Length A``Length B``Length A``A
困惑?
当我第一次遇到.我已经知道了,那么为什么需要“B”版本呢?LENGTHB()``LENGTH()
让我们来了解一下。
甲骨文兼容性
根据MariaDB问题12783,在引入之前(以及修改之前),事情是这样的:LENGTHB()``LENGTH()
- MariaDB将函数转换为SQL标准函数。
LENGTH()``OCTET_LENGTH() - Oracle 将函数转换为 SQL 标准函数。
LENGTH()``CHAR_LENGTH()
然后决定更改MariaDB的功能,使其行为不同,具体取决于它运行的SQL模式。具体说来:LENGTH()
- 在默认模式下运行时(即 ),MariaDB 将继续转换为 。
sql_mode=DEFAULT``LENGTH()``OCTET_LENGTH() - 但是,当在 Oracle 模式下运行时(即 ),它会转换为。
sql_mode=ORACLE``LENGTH()``CHAR_LENGTH()
正在推出LENGTHB()
这就把我们带到了函数。LENGTHB()
该功能是作为同一工作的一部分添加的。LENGTHB()
LENGTHB()是 无论 SQL 模式如何的同义词。换句话说,转换为何时和何时。OCTET_LENGTH()``LENGTHB()``OCTET_LENGTH()``sql_mode=DEFAULT``sql_mode=ORACLE
这使我们能够在代码中使用,而不必担心它受到用户设置的影响。LENGTHB()``sql_mode
区别
下表概述了这两个函数之间的区别。
| 功能 | 默认模式 | 甲骨文模式 |
|---|---|---|
LENGTH() |
返回字节数。 | 返回字符数。 |
LENGTHB() |
返回字节数。 | 返回字节数。 |
请注意,此差异仅在 MariaDB 10.3.1 中存在。在此之前,不存在,只是转换为 .LENGTHB()``LENGTH()``OCTET_LENGTH()
示例
下面是一个演示 和 之间区别的示例。LENGTH()``LENGTHB()
让我们将会话设置为使用默认模式:
SET SESSION sql_mode=DEFAULT;
我的会话可能已经处于默认模式,但显式设置它没有害处。
现在让我们运行并使用相同的参数:LENGTH()``LENGTHB()
SELECT
LENGTH('café'),
LENGTHB('café');
输出:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 5 | 5 |
+-----------------+------------------+因此,在默认模式下,它们都返回相同的值。
在这个示例中,它们都返回了 ,因为该字符串中有 5 个字节(字符使用 2 个字节,所有其他字符各使用 1 个字节)。5``é
现在让我们切换到 Oracle 模式:
SET SESSION sql_mode=ORACLE;
现在让我们重新运行上面的语句:
SELECT
LENGTH('café'),
LENGTHB('café');
输出:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 4 | 5 |
+-----------------+------------------+这次这两个函数之间存在差异。这次回来了.这比以前少了 1 个。LENGTH()``4
这是因为在 Oracle 模式下的行为不同。如前所述,当 ,函数转换为 ,返回字符数 – 而不是字节数。LENGTH()``sql_mode=ORACLE``LENGTH()``CHAR_LENGTH()
在前面的示例中, 返回了字节数,因为当 时,它转换为 。LENGTH()``sql_mode=DEFAULT``OCTET_LENGTH()