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()