構文宣言
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