バージョン10.3.1以降、MariaDBにはLENGTH()の両方が含まれています。 関数とLENGTHB() 機能。
その2番目のものにはBがあります 名前の最後に。つまり、Length Aのようなものです。 およびLength B 、ただしLength A Aがありません 。
混乱していますか?
LENGTHB()に最初に出会ったときは 。 LENGTH()についてはすでに知っていました 、では、なぜ「B」バージョンが必要なのですか?
調べてみましょう。
Oracleの互換性
MariaDBの問題12783によると、LENGTHB()の前 導入されました(そしてLENGTH()の前に 変更されました)次のように機能しました:
- MariaDBは関数
LENGTH()を変換します SQL標準関数OCTET_LENGTH()へ 。 - Oracleは関数
LENGTH()を変換します SQL標準関数CHAR_LENGTH()へ 。
その後、MariaDBのLENGTH()を変更することが決定されました。 機能するため、実行しているSQLモードに応じて動作が異なります。具体的には:
- デフォルトモードで実行している場合(つまり、
sql_mode=DEFAULT)、MariaDBは引き続きLENGTH()を翻訳しますOCTET_LENGTH()へ 。 - ただし、Oracleモードで実行している場合(つまり、
sql_mode=ORACLE)、LENGTH()を変換しますCHAR_LENGTH()へ 代わりに。
LENGTHB()の紹介
LENGTHB()に移動します 働き。
LENGTHB() 同じ作業の一部として関数が追加されました。
LENGTHB() OCTET_LENGTH()の同義語です SQLモードに関係なく。つまり、LENGTHB() OCTET_LENGTH()に変換されます sql_mode=DEFAULTの場合 sql_mode=ORACLEの場合 。
これにより、LENGTHB()を使用できるようになります ユーザーのsql_modeの影響を受けることを心配せずにコード内で 設定。
違い
これら2つの機能の違いを次の表に示します。
| 関数 | デフォルトモード | Oracleモード |
|---|---|---|
LENGTH() | バイト数を返します。 | 文字数を返します。 |
LENGTHB() | バイト数を返します。 | バイト数を返します。 |
この違いは、MariaDB10.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を返しました 、その文字列には5バイトがあるため(é 文字は2バイトを使用し、他のすべてはそれぞれ1バイトを使用します。
それでは、Oracleモードに切り替えましょう:
SET SESSION sql_mode=ORACLE; 次に、上記のステートメントを再実行しましょう:
SELECT
LENGTH('café'),
LENGTHB('café'); 結果:
+-----------------+------------------+
| LENGTH('café') | LENGTHB('café') |
+-----------------+------------------+
| 4 | 5 |
+-----------------+------------------+
今回は2つの機能に違いがあります。今回はLENGTH() 返された4 。以前より1つ少なくなっています。
これは、LENGTH()が原因です。 Oracleモードでは動作が異なります。前述のように、sql_mode=ORACLEの場合 、LENGTH() 関数はCHAR_LENGTH()に変換されます 、バイト数ではなく文字数を返します。
前の例では、LENGTH() sql_mode=DEFAULTの場合、バイト数を返しました 、OCTET_LENGTH()に変換されます 。