構文宣言
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
levels:
N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ...
説明
WEIGHT_STRING()関数は、入力文字列の重みを返します。戻り値は、文字列の比較およびソート値を表すバイナリ文字列です。比較ルールは以下のとおりです:
WEIGHT_STRING(str1) = WEIGHT_STRING(str2)の場合、str1 = str2(つまりstr1とstr2は等しい)。WEIGHT_STRING(str1) < WEIGHT_STRING(str2)の場合、str1 < str2(つまりstr1はstr2より前に来る)。
WEIGHT_STRING()関数は内部デバッグ専用であり、特に新しいソートルールを追加するシナリオにおいて、ソートルールのテストやデバッグに使用できます。
構文
WEIGHT_STRING()関数の構文は以下のとおりです:
| キーワード | 説明 |
|---|---|
| str | 入力された文字列式。
NULL以外の戻り値の長さがVARBINARYの最大長範囲内である場合、その値のデータ型はVARBINARY、そうでない場合はデータ型はBLOBです。 |
| AS | この句は、入力文字列を指定されたタイプと長さに変換します。オプションです。 |
| LEVEL | この句は、返される値の重みレベルを指定します。オプションです。 |
| flags | このパラメータは現在使用されていません。オプションです。 |
AS句の使用方法
AS 句は、入力文字列を非バイナリまたはバイナリ文字列に強制的に変換し、指定された長さに強制的に設定します。使用方法は以下のとおりです:
AS CHAR(N)は、文字列を非バイナリ文字列に変換し、右側にスペースでN(N>=1) 文字の長さに埋めます。Nが入力文字列の長さより小さい場合、文字列はN文字に切り捨てられ、切り捨て時にアラートは発生しません。AS BINARY(N)は、文字列をバイナリ文字列に変換し、Nはバイト(文字ではなく)単位で、0x00バイト(スペースではない)を使用して埋めます。
例:
obclient> SELECT HEX(WEIGHT_STRING('ab' AS CHAR(4)));
+-------------------------------------+
| HEX(WEIGHT_STRING('ab' AS CHAR(4))) |
+-------------------------------------+
| 41422020 |
+-------------------------------------+
1 row in set
obclient> SELECT HEX(WEIGHT_STRING('ab' AS BINARY(4)));
+---------------------------------------+
| HEX(WEIGHT_STRING('ab' AS BINARY(4))) |
+---------------------------------------+
| 61620000 |
+---------------------------------------+
1 row in set
LEVEL句の使用方法
LEVEL 句は、返される値にソートルールレベルの重みを含めるように指定するために使用できます。複数のレベルはカンマ(,)で区切ってリスト形式で指定でき、連続する複数のレベルはハイフン(-)で範囲を指定できます。例えば LEVEL1-5 です。
一般的に以下のルールに従います:
1未満のレベルはすべて1と見なされます。入力文字列のソートルールの最大値より大きいレベルはすべて、ソートルールの最大値と見なされます。最大値はソートルールによって異なりますが、決して6を超えることはありません。
レベルリスト内のレベルは昇順で並べ替える必要があります。特定のレベル範囲内で、2番目の数字が最初の数字より小さい場合は、最初の数字と同じと見なされます(例えば、
3-2は3-3と同等です)。LEVEL句が省略された場合、LEVEL 1 - maxと仮定されます。ここで、maxはソートルールの最大レベルです。LEVEL句が範囲表記ではなくリスト表記を使用する場合、レベル番号の後に以下の修飾子を使用できます:ASC:重みを変更せずに返します。これがデフォルト設定です。DESC:ビット反転した重みを返します。REVERSE:逆の順序で重みを返します(つまり、文字列を逆順にし、最初の文字を最後に、最後の文字を最初に配置します)。
例:
obclient> SELECT HEX(WEIGHT_STRING(0x56af LEVEL 1));
+------------------------------------+
| HEX(WEIGHT_STRING(0x56af LEVEL 1)) |
+------------------------------------+
| 56AF |
+------------------------------------+
1 row in set
obclient> SELECT HEX(WEIGHT_STRING(0x56af LEVEL 1 DESC));
+-----------------------------------------+
| HEX(WEIGHT_STRING(0x56af LEVEL 1 DESC)) |
+-----------------------------------------+
| A950 |
+-----------------------------------------+
1 row in set
obclient> SELECT HEX(WEIGHT_STRING(0x56af LEVEL 1 REVERSE ));
+---------------------------------------------+
| HEX(WEIGHT_STRING(0x56af LEVEL 1 REVERSE )) |
+---------------------------------------------+
| AF56 |
+---------------------------------------------+
1 row in set
obclient> SELECT HEX(WEIGHT_STRING(0x56af LEVEL 1 DESC REVERSE ));
+--------------------------------------------------+
| HEX(WEIGHT_STRING(0x56af LEVEL 1 DESC REVERSE )) |
+--------------------------------------------------+
| 50A9 |
+--------------------------------------------------+
1 row in set
例
バイナリ文字列「AB」の重みを求め、HEX() を使用して WEIGHT_STRING() の結果を表示します。
obclient> SET @s = CAST('AB' AS BINARY);
Query OK, 0 rows affected
obclient> SELECT @s, HEX(@s), HEX(WEIGHT_STRING(@s));
+------+---------+------------------------+
| @s | HEX(@s) | HEX(WEIGHT_STRING(@s)) |
+------+---------+------------------------+
| AB | 4142 | 4142 |
+------+---------+------------------------+
1 row in set