バージョン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()
に変換されます 。