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

MariaDBでのBINARY演算子のしくみ

    MariaDBでは、BINARY 演算子は、それに続く文字列をバイナリ文字列にキャストします。

    BINARY 演算子を使用すると、文字ごとではなく、バイトごとに列を比較できます。これにより、列がBINARYとして定義されていない場合でも、比較で大文字と小文字が区別されます。 またはBLOB 。また、先頭/末尾のスペースが重要になることも意味します。

    簡単な例を次に示します。

    SELECT BINARY 'Cat';

    結果:

    +--------------+
    | BINARY 'Cat' |
    +--------------+
    | Cat          |
    +--------------+

    この例は、BINARYがどのように機能するかを実際には示していません。 演算子は文字列の比較に影響を与える可能性があります。次の例はそうです。

    リーディング/トレーリングスペース

    前述のように、文字列をバイトごとに比較する場合(つまり、BINARYを使用する場合、先頭と末尾のスペースは重要です。 。

    まず、先頭または末尾にスペースを入れずに文字列を比較します。

    SELECT 
        'Cat' = 'Cat',
        BINARY 'Cat' = 'Cat';

    結果:

    +---------------+----------------------+
    | 'Cat' = 'Cat' | BINARY 'Cat' = 'Cat' |
    +---------------+----------------------+
    |             1 |                    1 |
    +---------------+----------------------+

    BINARYを使用しても、同じ戻り値が得られます かどうか。

    ただし、文字列の1つに末尾のスペースを追加すると次のようになります。

    SELECT 
        'Cat' = 'Cat ',
        BINARY 'Cat' = 'Cat ',
        'Cat' = BINARY 'Cat ',
        BINARY 'Cat' = BINARY 'Cat ';

    結果:

    +----------------+-----------------------+-----------------------+------------------------------+
    | 'Cat' = 'Cat ' | BINARY 'Cat' = 'Cat ' | 'Cat' = BINARY 'Cat ' | BINARY 'Cat' = BINARY 'Cat ' |
    +----------------+-----------------------+-----------------------+------------------------------+
    |              1 |                     0 |                     0 |                            0 |
    +----------------+-----------------------+-----------------------+------------------------------+

    最初のものは1を返します 一方、他のもの(つまり、BINARYを持つもの) )return 0

    念のため、両方に末尾にスペースがある文字列を比較してみましょう。

    SELECT
        'Cat ' = BINARY 'Cat ',
        BINARY 'Cat ' = BINARY 'Cat ';

    結果:

    +------------------------+-------------------------------+
    | 'Cat ' = BINARY 'Cat ' | BINARY 'Cat ' = BINARY 'Cat ' |
    +------------------------+-------------------------------+
    |                      1 |                             1 |
    +------------------------+-------------------------------+

    ここでは、先頭と末尾のスペースについてのみ話していることに注意してください。この概念は、文字列の途中のスペースには適用されません。

    たとえば、BINARYを使用しなくても、文字列内の2つのスペースは1つのスペースと等しくありません。 演算子:

    SELECT 'Homer Jay' = 'Homer  Jay';

    結果:

    +----------------------------+
    | 'Homer Jay' = 'Homer  Jay' |
    +----------------------------+
    |                          0 |
    +----------------------------+

    この場合、最初の文字列には1つのスペースが含まれ、2番目の文字列には2つのスペースが含まれます。文字ごとの比較を使用する場合でも、不平等になるにはそれで十分です。

    大文字と小文字の区別

    BINARY 照合で大文字と小文字が区別されない場合でも、演算子は大文字と小文字を区別する比較を強制します。

    たとえば、これが私の接続の照合です:

    SELECT @@collation_connection;

    結果:

    +------------------------+
    | @@collation_connection |
    +------------------------+
    | utf8_general_ci        |
    +------------------------+

    ci 最後に、大文字と小文字を区別しないを意味します 。

    大文字と小文字の文字列の文字列比較の例を次に示します。

    SELECT 
        'cat' = 'CAT',
        BINARY 'cat' = 'CAT';

    結果:

    +---------------+----------------------+
    | 'cat' = 'CAT' | BINARY 'cat' = 'CAT' |
    +---------------+----------------------+
    |             1 |                    0 |
    +---------------+----------------------+

    私の照合では大文字と小文字が区別されないため、最初の比較では1が返されました。 2番目のものは0を返しました 、BINARYを使用しているため オペレーター。

    このような文字列比較で得られる結果(BINARYなし) 演算子)は、照合によって異なります。大文字と小文字を区別する照合を使用すると、BINARYで取得したのと同じ結果が返されます。 。

    デモンストレーションの例を次に示します。

    SELECT 
        _latin1'cat' COLLATE latin1_general_ci = 'CAT' AS 'ci',
        _latin1'cat' COLLATE latin1_general_cs = 'CAT' AS 'cs',
        BINARY 'cat' = 'CAT';

    結果:

    +------+------+----------------------+
    | ci   | cs   | BINARY 'cat' = 'CAT' |
    +------+------+----------------------+
    |    1 |    0 |                    0 |
    +------+------+----------------------+

    ここでは、文字セットと照合を文字列レベルで明示的に指定しました。これを行うための構文は次のようになります:

    [_charset_name]'string' [COLLATE collation_name]

    大文字と小文字を区別しない照合では、大文字と小文字を区別する照合とは異なる結果が返されることがわかります。また、大文字と小文字を区別する照合では、BINARYを使用した場合と同じ結果が返されました。 オペレーター。


    1. Postgres 9.1でテーブルのOIDを決定しますか?

    2. 1-3,5,10-15,20のような式に数字が含まれているかどうかを検索します

    3. 一部の集計変換が壊れています

    4. エンベロープを取得します。つまり、重複する期間