《NULL值的多義性分析》
談到NULL值,很多人都是很熟悉,但是深入了解后,又感覺到陌生,對其含義和用法,都無法很準確的理解。NULL在數據庫和編程語言中,存在的意義和附帶的含義不同。
NULL這個概念,在數據庫中產生的時候就存在異議。NULL值的意義現在主流的想法為:“未知值或不確定的值”。至于是否應該被視為未知值或不確定的值,存在較大的爭議。
NULL值在編程語言中的意思為“空的引用”,即變量只是申明了,但沒有實例化,在內存中沒有分配內存。
由于NULL值在編程語言和數據庫中的含義存在差異,導致對NULL值很難把握,現在就來談一下NULL值在數據庫中的含義和在編程語言中的含義和用法。
一.NULL值在數據庫中的含義與用法:
1.NULL值在數據庫中的含義:
NULL值既不是為零,也不是空白,NULL值實際是指未知值或不確定值,缺少的數據。
2.NULL值的用法:
NULL在數據庫中的含義是不確定的,這樣可以使數據庫操作人員區分故意記錄為零的數據及在系統中未記錄的數據,或者特意輸入NULL的數據。
3.NULL值的不確定性所帶來的作用:
(1)在(值的)計算或比較中不能使用它。
(2)NULL值相互之間并不相等,因此NULL之間無法比較大小。(類似于數學中的無窮大之間的比較)
(3)在計算類似AVG、SUM、MAX COUNT這樣的聚合函數時,會忽略包含NULL值的列。
(4)在查詢GROUP BY子句中出現包含NULL值的列時,查詢輸出中僅有一行包含NULL值。
4.各種數據庫平臺對NULL的處理方式:
(1)在oracle數據庫中,一個NULL字符串,是以NULL值插入的。
(2)在SQL Server、MySQL等數據庫中,是以VARCHAR和CHAR列中插入空字符串。
二.NULL值在編程語言中含義和用法:
NULL值在編程語言中的含義與用法(主要編程語言:C#,JAVA等面向對象的語言)
1.面向對象的編程語言中(主要編程語言:C++,C#,JAVA)類型的劃分:
面向對象的編程語言中將數據類型劃分為:值類型和引用類型。(都可以為泛型類型)
(備注:C++,C#具有第三種類型:指針類型)
說明:值類型和引用類型的區別---值類型的變量直接包含了它們的數據,引用類型的變量只保存了指向它們數據的引用,數據通常也稱為對象。(任何類型的值都可以被當作是一個對象)
2.編程語言中的NULL含義:
空的引用(變量只定義了,但未賦值),NULL與所有的引用類型都是兼容的,代表缺失某個實例。
3.數據類型中的NULL值意義:
(1).值類型:只要是可空值類型的值類型的值類型變量都可以包含NULL值;對于不可為空值的值類型,則有一個對應的可空值類型表示了和它相同的值的集合加上NULL值。
(2).Bool類型:在C/C++中,一個整數零或者浮點數零,或空指針,都可以表示成布爾值false,相反則為true;在c#和java中,轉換必須通過顯示地將整數或浮點數值和零比較,或者顯示地比較對象引用和NULL;
(注:在比較NULL的時候,非布爾值不能轉換成布爾值。)
(3).引用類型:引用類型的值是一個指向某個類型實例的引用,這個實例叫做對象,特殊只NULL和所有的引用類型都是兼容的,代表缺失某個實例。
4.NULL值在編程語言中的意義:
(1).空對象:是一種變體稱為空迭代器模型式,它使得在組合層次結構中遍歷各個節點的操作對客戶端透明(客戶端可以使用相同的邏輯來遍歷組合和葉子節點)
(2).空對象的意義:最有用的地方在于它更靠近數據,因為對象表示的是問題空間內的實體。
三.NULL值在編程語言和數據庫之間數據操作處理:
1.編程語言中的數據如何寫入數據庫:
(1).在通過數據庫連接(java中使用JDBC,C#應用對應的數據源連接數據庫),在連接成功后,獲取數據庫中的數據,SQL中的NULL被映射到Java(C#)中的null。這可能會導致人們認為類似Java(C#)中null==null的情況,SQL中也存在NULL= NULL。
2.編程語言如何從數據庫中取出值,判斷是否為NULL:
(1).將取出的數據轉化為字符串類型,然后進行判斷。
(2).利用語言提供的方法判斷。(C#中使用DBNull或isnull)
文章列表