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

MySQLでのWEIGHT_STRING()関数のしくみ

    MySQLでは、WEIGHT_STRING() 関数は、入力文字列の重み文字列を返します。戻り値は、文字列の比較値と並べ替え値を表すバイナリ文字列です。

    入力文字列が非バイナリ値の場合、戻り値には文字列の照合の重みが含まれます。バイナリ値の場合、結果は入力文字列と同じになります。これは、バイナリ文字列の各バイトの重みがバイト値であるためです。

    この関数は、内部使用を目的としたデバッグ関数です。照合のテストとデバッグに使用できます。 MySQLのバージョン間で動作が変わる可能性があることに注意してください。

    構文

    構文は次のようになります:

    WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

    str 入力文字列です。オプションのAS 句を使用すると、入力文字列を特定のタイプと長さにキャストできます。オプションのflags 引数は現在MySQLでは使用されていません(バージョン8.0以降)。

    例1-基本的な使用法

    非バイナリ入力文字列を使用した基本的な使用例は次のとおりです。

    SELECT HEX(WEIGHT_STRING('Cat'));

    結果:

    +---------------------------+
    | HEX(WEIGHT_STRING('Cat')) |
    +---------------------------+
    | 1C7A1C471E95              |
    +---------------------------+
    

    HEX()を使用していることに注意してください WEIGHT_STRING()を表示する関数 結果。これは、WEIGHT_STRING()が原因です。 バイナリ結果を返します。 HEX()を使用できます 結果を印刷可能な形式で表示します。

    HEX()を使用しない場合 この例では、次のようになります:

    SELECT WEIGHT_STRING('Cat');

    結果:

    +----------------------+
    | WEIGHT_STRING('Cat') |
    +----------------------+
    | zG?                |
    +----------------------+
    

    明確にするために、文字列、その文字列の16進表現、およびその重み文字列の16進表現を次に示します。

    SET @str = 'Cat';
    SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));

    結果:

    +------+-----------+--------------------------+
    | @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) |
    +------+-----------+--------------------------+
    | Cat  | 436174    | 1C7A1C471E95             |
    +------+-----------+--------------------------+
    

    例2–AS句

    ASを使用した例を次に示します 入力文字列を指定されたタイプと長さにキャストする句。

    SET @str = 'Cat';
    SELECT 
      HEX(WEIGHT_STRING(@str AS CHAR(3))) 'Char 3',
      HEX(WEIGHT_STRING(@str AS CHAR(8))) 'Char 8',
      HEX(WEIGHT_STRING(@str AS BINARY(3))) 'Binary 3',
      HEX(WEIGHT_STRING(@str AS BINARY(8))) 'Binary 8';

    結果:

    +--------------+--------------+----------+------------------+
    | Char 3       | Char 8       | Binary 3 | Binary 8         |
    +--------------+--------------+----------+------------------+
    | 1C7A1C471E95 | 1C7A1C471E95 | 436174   | 4361740000000000 |
    +--------------+--------------+----------+------------------+
    

    例3–照合

    次の2つの例は、使用されている照合に応じて、文字列が異なる重みの文字列を持つ方法を示しています。最初の例で使用されている照合は、アクセントと大文字と小文字を区別しません。 2番目の例で使用されている照合は、アクセントと大文字と小文字が区別されます。

    SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_ai_ci;
    SET @lower = lcase(@upper);
    SELECT 
      @upper 'String', 
      HEX(@upper) 'Hex', 
      HEX(WEIGHT_STRING(@upper)) 'Weight String'
    UNION ALL
    SELECT 
      @lower, 
      HEX(@lower), 
      HEX(WEIGHT_STRING(@lower));

    結果:

    +--------+--------+---------------+
    | String | Hex    | Weight String |
    +--------+--------+---------------+
    | CAT    | 434154 | 1C7A1C471E95  |
    | cat    | 636174 | 1C7A1C471E95  |
    +--------+--------+---------------+
    

    アクセントと大文字と小文字を区別する照合を除いて、同じ例を次に示します。

    SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_as_cs;
    SET @lower = lcase(@upper);
    SELECT 
      @upper 'String', 
      HEX(@upper) 'Hex', 
      HEX(WEIGHT_STRING(@upper)) 'Weight String'
    UNION ALL
    SELECT 
      @lower, 
      HEX(@lower), 
      HEX(WEIGHT_STRING(@lower));

    結果:

    +--------+--------+----------------------------------------------+
    | String | Hex    | Weight String                                |
    +--------+--------+----------------------------------------------+
    | CAT    | 434154 | 1C7A1C471E9500000020002000200000000800080008 |
    | cat    | 636174 | 1C7A1C471E9500000020002000200000000200020002 |
    +--------+--------+----------------------------------------------+
    

    1. データベースプロキシのフェイルオーバー時間の比較-ProxySQL、MaxScale、HAProxy

    2. 過去10日間の日付のレコードを一覧表示するにはどうすればよいですか?

    3. SQLitEdatabseからロードされたデータがモデルクラスArrayListandroidに保存されていません

    4. MySQL:同じテーブルを複数回結合するにはどうすればよいですか?