Null

「何も示さないもの」を表すコンピュータ用語

🔥 Top keywords: デジモンストーリー ロストエボリューションヴァンガード火曜日の女シリーズ藤原宮子豊見城警察署メインページ特別:検索フィット (芸能プロダクション)小林製薬水原一平笠置シヅ子大林ミカ土方歳三壇蜜ウィル・アイアトン河合優実村杉蝉之介ルーグネッド・オドーアコテージ作戦尾澤るな新選組森川葵近藤勇吉木りさベニコウジカビショーンK西丸優子寺田心チェ・ジョンヒョプ大谷翔平宮本恒靖桐谷美玲キスカ島撤退作戦日本航空351便ハイジャック事件薬屋のひとりごと相棒八代亜紀二階俊博島田直也葬送のフリーレンショーン・コムズ神武天皇ILLITエンプロ (芸能プロダクション)マッシュル-MASHLE-島津有理子相棒の登場人物松岡利勝ロバート・オッペンハイマーシトリニン斉藤孝信アルフ (テレビドラマ)飛田遊廓グループ魂江利チエミサグラダ・ファミリアGTO (1998年のテレビドラマ)森喜朗相武紗季特別:最近の更新美村里江有働由美子服部良一西谷浩一長谷川岳青井実森香澄中山美穂ガリレオ (テレビドラマ)翼和希3月27日二階堂ふみ上白石萌音暇空茜ボルチモア麻美ゆま宇部炭鉱杉原杏璃フランシス・スコット・キー橋 (ボルティモア)淡谷のり子尊富士弥輝也スコット・ハインマン椛島光ダレン・シャン (小説)ハドソン川の奇跡 (映画)不適切にもほどがある!辻愛沙子トゥルーマン・ショー神田眞人林田理沙三体野際陽子ブギウギ (テレビドラマ)青山剛昌松嶋菜々子オッペンハイマー (映画)中村悠平黒木瞳三江彩花反町隆史オナニーカリオストロME:I林佑香

Null(ヌル、ナル)は、何もない、という意味で、プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われる。同様のものとして、nil(ニル) が使われることもある。ただし、PythonNoneが使われる。

ドイツ語において Null は数値の0(ゼロ)を意味し、発音は /nʊl/ である。一方、英語において null/nʌl/ と発音される。[1]ドイツ語においても、数値の0と区別するために、本記事の意味の Null は英語風に /nʌl/ と発音される場合がある。[2][3]

日本においては「ヌル」という発音が定着しているが、英語読みに近い「ナル」という発音で呼ばれる場合もある。例えば、JISJIS X 3005-1:2014「データベース言語SQL 第1部:枠組(SQL/Framework)」日本産業標準調査会経済産業省)のP4には「ナル値 (Null Value)」、JIS X 3010:2003「プログラム言語C」日本産業標準調査会経済産業省)のP4には「ナル文字 (Null Character)」という記述がある。この他にも専門書[4]や国家試験[5]でも見られる。

プログラミング言語などにおいて、nullnilといった予約語定数名のものなどの意味がどういったものかは言語により、場合によっては実装ごとに違う。ポインタ参照のある言語では、ヌルポインタなどと呼ばれる何も指さない特別なポインタであることもあるし、Pythonのようにオブジェクトのひとつであることもある[6]。古典的なLISPのように真理値の偽(の代表)や空リスト()」を兼ねたもの(それらと同じもの)だったりすることもある。

語源編集

ラテン語で「」を意味する nullus[1]に由来する[7]。nil もラテン語の nihil の短縮形に由来する[8]

英語では null はコンピュータに限らず使われ、しばしば zero または empty と交換可能である。例えば、null matrixzero matrix零行列)、null setempty set空集合)と同義である。

ヌルポインタ編集

ポインタや参照が無効であることを示す。C言語では無効ポインタを表現するための特別な値として、処理系定義のNULLマクロが用意された[9]。Cの規格ではNULLポインタの内部数値は0とは規定されていないが、0をポインタ型にキャストするとヌルポインタになることは規定されているので、代表的な実装では以下のようになっている。

#define NULL    ((void*)0)

またC言語から派生したC++では、C言語から引き継いだNULLマクロ定義が存在するが、Cとは違ってvoid*から他の型へのポインタに暗黙変換することを禁止したため、C++03規格までは以下のように整定数0に等しかった。

#define NULL    0

しかし、これは基本整数型intの0と型システムの上では同じになるため、しばしばオーバーロードの呼び間違いが生じることとなった。これを解消するためC++11規格では専用のstd::nullptr_t型を持つリテラルを表すnullptrキーワードが導入され[10]NULLマクロは処理系定義となった[11]

C++以後の言語ではnullを最初から専用構文として導入した事例が多い。

その他のヌル編集

PythonではNoneという名前で、その値は組込みオブジェクトである。バージョン2.4からNoneには代入できなくなった。Rubyではnilというキーワードで、意味は組込みオブジェクトである。LISPではNILで、どれでも同じようなものだが実体の詳細は様々で、carやcdrをとるとそれぞれでまたnilが返ってくる実装もあればエラーになる実装もある(普通はnilかどうかをまずテストして、carやcdrしないようにする)。

null型編集

構文上、nullは多くの言語で特別なnullリテラルという扱いだが、リテラルのための型「null型」(またはNull型、NULL型とも)が規定される言語が存在する。null型の値はnullのみが許される。

プログラム言語の文法上null型が存在するケースでは、一般的な型同様にnull型を用いることが出来るが、null型を扱えない言語も存在する。

例えばJavaでは「null型」はあるが、ユーザーコードで利用することはできない。言語仕様では、nullリテラルはnull型であり、null型には名前がなく、null型の変数宣言やnull型へのキャストをすることは不可能である、という扱いとなっている。以上より、null型は内部的に存在するが、構文などの上でそれを扱うことができず、その値を表すリテラルのみが存在する[12]

ヌル文字編集

ヌル文字列編集

nullデバイス編集

nullデバイスは、存在しない架空のデバイスを表す。nullデバイスに出力すると、実際はどこにも出力されず廃棄される。

UNIXLinuxでは/dev/nullMS-DOSMS WindowsではNULで表される。

データベースのNULL編集

データベースのNULLは、欄が空欄であることを示す。これは人が読む用の(ひょう)のNAにあたり、C言語のNULLよりは浮動小数点演算のNaN(非数)に近い。

具体的にはNULLには、未知・不明 (Unknown) の場合と適用不能・非存在 (Not Applicable, Inapplicable) の場合がある。例えば、名前がNULLの場合、未知のNULLは「名前はあるが分からない」ということを、適用不能のNULLは「名前が存在しない」(例えば、独身者の配偶者の名前)ことを示す。これはエドガー・F・コッドによる分類だが、彼はさらに詳細な分類をしている。

なおそれらに対し、名前欄が空文字列の場合は、(事前の取り決めがなければ)名前はあり、知っていて、欄に書かれている通り「」であることを示す。未知や適用不能のために、空文字列、文字列 'UNKNOWN'、0、-1、9999年12月31日、未使用のコードなど特定のありえない値を例外値として使うことがしばしばあるが、それらは実際の値であるとして処理されてしまう危険がある。

NULLはNULL値(あるいは空値)と呼ばれることもあるが、コッドによると値ではない(特殊な値や例外的な値ではない)。値ではないのでもない。整数型の列にあるNULLも文字列型の列にあるNULLも同じNULLであり、NULL整数・NULL文字列などの区別はない。内部的にはNULLは、(NaNやヌルポインタのような)特定のビット列ではなく、値とは別個の「NULLかどうか」を表すメモリ領域で管理されていることが多い。

SQLのNULL編集

NULL を含む演算の結果編集

NULLを含む演算の多くは結果がNULLとなる。例えば

NULL + 1NULL / 0NOT NULLNULL AND TRUELENGTH(NULL)

はいずれもNULLである(0で割っても0除算は発生しない)。これは浮動小数点演算でNaNを含む式の結果がNaNになるのと似た規定である。この規定によりNULLを許容する演算は煩雑になりやすくなることから、データーベース・ベンダーによる拡張が行われている場合がある。この問題は、WHERE句でNULLでありうる列を診断しようとしたとき、特にDELETEやUPDATEで悲惨な結果を呼ぶことがある。回避方法は、NULLが混入する可能性を充分に検討し、IS NULL 演算子を駆使して式を慎重に組み立てる以外にない。

ただし少なからず場合に、NULLを含む演算で結果がNULL以外になる。このためNULLは無制限には伝播しない。ただししばしば、NULLの絡んだ演算の実装は不完全で、処理系依存が多い。

比較・IN述語など論理値を返すべき場面では、NULLを含む結果は UNKNOWN となる。UNKNOWN は、値ではないNULL(あるいは「不明 Unknown のNULL」)とは異なり TRUE(真)・FALSE(偽)に並ぶ第3の論理値である。例えば

NULL = NULLNULL <> NULLNULL = 1NULL <> 1NULL < 1NULL IN (1, 2, 3)NULL IN (1, 2, NULL)

などはいずれもUNKNOWNになる。ただし、UNKNOWNの扱いにもNULLに似た難しさがある。

論理式でNULLとならない場合がある。

NULL AND FALSENULL OR TRUE

はそれぞれFALSE、TRUEである(NULL AND TRUE、NULL OR FALSE がNULLになるのとの違いに注意)。

Oracleは空文字列とNULLを区別しないため、NULL あるいは空文字列を含む演算で非標準な結果となることがある。例えば、文字列と NULL を連結すると本来は NULL になるが、Oracleでは文字列の値を変えない(ただし NULL 同士の連結は NULL になる)。

'A' || NULL    -- IS NULL, ただし Oracle では = 'A'NULL || NULL    -- IS NULL

NULLを扱うための工夫編集

テーブルの各列には、NULLを保持できないと指定することができる。例えば、全ての行で必ず異なる値が含まれなければならないと指定されている列であっても、複数の行がNULLを保持できてしまう。そこで、この列にNULLを保持できないと指定すればこの問題が回避できる。

ソートでは、NULLはいかなる値よりも小さいとして扱われる(ただしOracleは逆にいかなる値よりも大きいとして扱われるが、オプションで変更できる)。しかし論理値でのソートが実装されていれば、以下のように IS (NOT) NULL を第1のソートキーに使ってNULLを先または後に変更できる。

ORDER BY col IS NOT NULL, col    -- NULLは最初ORDER BY col IS NULL, col     -- NULLは最後

また、CASE式やCOALESCE関数(あるいはOracleならNVL関数も可)を使って、NULLに任意の値を割り当ててソートすることができる。以下の句はいずれも、colがNULLならば0を割り当ててソートする。

ORDER BY CASE WHEN col IS NULL THEN 0 ELSE col ENDORDER BY COALESCE(col, 0)ORDER BY NVL(col, 0)    -- Oracleのみ

脚注編集

  1. ^ a b 実際の発音はHow To Pronounce nullを参照のこと。
  2. ^ Wiki Baike Deutsch - Nullwert”. 2019年9月15日閲覧。
  3. ^ StackExchange - German Language - “null” (zero) vs. “NULL””. 2019年9月15日閲覧。
  4. ^ Cクイックリファレンス第二版 P57ほか Peter Prinz,Tony Crawford著 黒川利明訳 島敏博技術監修 オライリー・ジャパン発行
  5. ^ 例えば、平成28年度技術士第1次試験 専門科目 情報工学部門[1]の問III-22
  6. ^ 証拠として例えばNone.__str__()のように参照できる。
  7. ^ null adjective - Definition, pictures, pronunciation and usage notes”. Oxford University Press. 2016年6月2日閲覧。
  8. ^ nil noun - Definition, pictures, pronunciation and usage notes”. Oxford University Press. 2016年6月2日閲覧。
  9. ^ NULL - cppreference.com (C)
  10. ^ nullptr - cpprefjp C++日本語リファレンス
  11. ^ NULL - cppreference.com (C++)
  12. ^ "The Java® Language Specification Java SE 8 Edition"


🔥 Top keywords: デジモンストーリー ロストエボリューションヴァンガード火曜日の女シリーズ藤原宮子豊見城警察署メインページ特別:検索フィット (芸能プロダクション)小林製薬水原一平笠置シヅ子大林ミカ土方歳三壇蜜ウィル・アイアトン河合優実村杉蝉之介ルーグネッド・オドーアコテージ作戦尾澤るな新選組森川葵近藤勇吉木りさベニコウジカビショーンK西丸優子寺田心チェ・ジョンヒョプ大谷翔平宮本恒靖桐谷美玲キスカ島撤退作戦日本航空351便ハイジャック事件薬屋のひとりごと相棒八代亜紀二階俊博島田直也葬送のフリーレンショーン・コムズ神武天皇ILLITエンプロ (芸能プロダクション)マッシュル-MASHLE-島津有理子相棒の登場人物松岡利勝ロバート・オッペンハイマーシトリニン斉藤孝信アルフ (テレビドラマ)飛田遊廓グループ魂江利チエミサグラダ・ファミリアGTO (1998年のテレビドラマ)森喜朗相武紗季特別:最近の更新美村里江有働由美子服部良一西谷浩一長谷川岳青井実森香澄中山美穂ガリレオ (テレビドラマ)翼和希3月27日二階堂ふみ上白石萌音暇空茜ボルチモア麻美ゆま宇部炭鉱杉原杏璃フランシス・スコット・キー橋 (ボルティモア)淡谷のり子尊富士弥輝也スコット・ハインマン椛島光ダレン・シャン (小説)ハドソン川の奇跡 (映画)不適切にもほどがある!辻愛沙子トゥルーマン・ショー神田眞人林田理沙三体野際陽子ブギウギ (テレビドラマ)青山剛昌松嶋菜々子オッペンハイマー (映画)中村悠平黒木瞳三江彩花反町隆史オナニーカリオストロME:I林佑香