MySQLのASCII()関数にNULLを渡した場合、何が返されるのか?
MySQLのASCII()関数は、引数として渡された文字列の先頭文字に対応するASCIIコード(数値コード)を返す関数です。しかし、NULLを渡した場合、その挙動は「NULLという文字列」を渡しているのか、それとも「NULL値そのもの」を渡しているのかによって異なります。
ASCII()関数におけるNULLの扱い
以下の実行例で、それぞれのケースにおける違いを確認してみましょう。
実行例
mysql> SELECT ASCII(null);
+-------------+
| ASCII(null) |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT ASCII('null');
+---------------+
| ASCII('null') |
+---------------+
| 110 |
+---------------+
1 row in set (0.00 sec)
mysql> Select ASCII(NULL);
+-------------+
| ASCII(NULL) |
+-------------+
| NULL |
+-------------+
1 row in set (0.00 sec)
mysql> Select ASCII('NULL');
+---------------+
| ASCII('NULL') |
+---------------+
| 78 |
+---------------+
1 row in set (0.00 sec)
結果の解説
上記の結果セットから、次のような違いがあることがわかります。
- 'NULL' や 'null' を文字列として渡した場合:ASCII()関数は先頭文字の数値コードを返します。具体的には、'NULL' の場合は大文字の「N」に対応する 78、'null' の場合は小文字の「n」に対応する 110 が返されます。
- NULL値そのものを渡した場合:文字列として扱う対象が存在しないため、戻り値として NULL が返されます。
このように、ASCII()関数にNULLを渡す際は、引用符で囲まれた文字列なのか、それともSQLのNULLリテラルなのかを意識することが重要です。特にデータのクリーニングや変換処理を行う際には、意図しないNULLの返却を避けるために、事前にISNULL()関数などでNULLチェックを行っておくと安全です。
-
MySQLのMAKE_SET()関数:文字列がすべてNULLの場合に何が返されるか?
MySQLのMAKE_SET()関数では、引数として渡された文字列がすべてNULLである場合、結果として空の文字列が返されます。これは、MAKE_SET()関数がビットマスクに基づいて文字列を選択する仕組みを持っているためです。選択対象となる有効な文字列が一つも存在しない場合、関数は何も含まない空の結果を返します。動作例以下の例では、3つの引数すべてにNULLを指定してMAKE_SET()関数を実行しています。mysql> Select MAKE_SET(2, NULL,NULL,NULL); +-----------------------------+ | MAKE_SET(2, N
-
ビット値が1でも最初の文字列がNULLの場合、MySQLのMAKE_SET()関数は何を返す?
MySQLのMAKE_SET()関数におけるNULL文字列の扱いMySQLのMAKE_SET()関数は、指定されたビット値に基づいて複数の文字列からセットを構築して返す関数です。ただし、ビットの値が1であっても、そのビットに対応する文字列がNULLである場合、関数はその文字列を結果に含めず、何も返しません(空の結果となります)。動作の仕組みMAKE_SET()関数では、第1引数のビット値によってどの文字列を選択するかが決まります。最下位ビット(値1)は最初の文字列に、次のビット(値2)は2番目の文字列に、というように各ビットが順番に対応しています。そして、選択対象となった文字列がNULLだった