sql >> データベース >  >> RDS >> MariaDB

MariaDB LENGTH()とLENGTHB():違いは何ですか?

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


    1. Neo4j-Cypherを使用してノードを作成する

    2. トリガー内で例外を発生させる方法は?これを行う方法はありますか?

    3. OracleAppsR12でSSLまたはTLSを有効にする

    4. WHMのデータベースのみのバックアップ