1. 程式人生 > >MySQL 中NULL和空值的區別,索引列是否可空值或null

MySQL 中NULL和空值的區別,索引列是否可空值或null

在建立表的時候儘量把欄位的預設值設定成 not null,除非你想儲存null;因為在mysql中為null的的欄位不會走索引,做統計的時候也不會被統計進去,如果想統計進去必須做特定的處理,這樣做比較複雜。可以給欄位的值設定成0、一個特殊的值或者一個空串代替空值。

MySQL難以優化引用了可空列的查詢,它會使索引、索引統計和值更加複雜。
可空列需要更多的儲存空間,還需要在MySQL內部進行特殊處理。當可空列被索引的時候,
每條記錄都需要一個額外的位元組,還可能導致 MyISAM 中固定大小的索引(例如一個整數列上的索引)變成可變大小的索引。 

建立表

CREATE TABLE `test_null` (
  `id` int(11) NOT NULL,
  `name` varchar(16) DEFAULT '',
  `name_null` varchar(16) DEFAULT NULL,
  `name_empty` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

(1)在進行count()統計某列的記錄數的時候(null不會統計進來)或者查詢不是某個值的時候(null值不會查出來),但是空值是會進行統計到其中的。

做特殊的處理:

大家可以試試統計name_empty預設值給空的欄位

(2)MySQL中的NULL其實是佔用空間的,空值('')是不佔用空間的

(3)判斷NULL 用IS NULL 或者 is not null,在sql語句中可以用IFNULL(expr1,expr2)函式,如果想判斷空字元用=''或者 <>、!=''來進行處理。

相關推薦

MySQL NULL區別索引是否null

在建立表的時候儘量把欄位的預設值設定成 not null,除非你想儲存null;因為在mysql中為null的的欄位不會走索引,做統計的時候也不會被統計進去,如果想統計進去必須做特定的處理,這樣做比較複雜。可以給欄位的值設定成0、一個特殊的值或者一個空串代替空值。 MySQ

多線程sleepwait的區別以及多線程的實現方式及原因定時器--Timer

守護 驗證 取消 技術 方法 代碼 安全 接口 art 1. Java中sleep和wait的區別 ① 這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自Object類。 sleep是Thread的靜態類方法,誰調用的誰去睡覺,即使在a線程裏調用b

mysqlnowsysdate的區別

mysql now和sysdatemysql 中now獲取的是sql執行的時間,sysdate獲取的是系統時間在master 和slave 主從過程中會導致時間的不一致導致報錯例如:Unsafe statement written to the binary log using statement form

淺談Mysqlwherehaving的區別

where和having的區別一、誤區:不要錯誤的認為having和group by 必須配合使用.二、where和having用法解析:1、 where和having都可以使用的場景: select goods_price,goods_name from goods where goods_price &g

mysql inexists的區別

有兩張表:student 和 studentcource student 表 studentcource 表 需求:查詢所有成績小宇60分的同學 in 原理: 1、先查詢 <60 學生得到student_id列表 select student_id

MySQL char varchar 的區別

 一、VARCHAR與CHAR字元型資料的差異   在MySQL資料庫中,用的最多的字元型資料型別就是Varchar和Char,這兩種資料型別雖然都是用來存放字元型資料,但是無論從結構還是從資料的儲存方式來看,兩者相差很大。而且其具體的實現方式,還依賴與儲存引擎。我這裡就以大家最常用的MYISAM儲

MySqlexistsin的區別

exists介紹 exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條

MySqlwherehaving的區別

    1、where 後不能跟聚合函式,因為where執行順序大於聚合函式。     2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,條件 中不能包含聚組函式,使用where條件顯示特定的行。     3、hav

Robotframework字典JSON的區別相互轉換方法

1、標準的Json格式如下:  { "firstName":"Eddy" , "lastName":"Peng" } key和value都是採用雙引號的方式進行包裹。 2、但是Robotframework中建立的字典預設採用的是單引號進行包裹,所以並不能直接作為JSON使用

全面瞭解mysqlutf8utf8mb4的區別

一.簡介         MySQL在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一

MySQLinteractive_timeoutwait_timeout的區別 MySQLinteractive_timeoutwait_timeout的區別

MySQL中interactive_timeout和wait_timeout的區別   在用mysql客戶端對資料庫進行操作時,開啟終端視窗,如果一段時間沒有操作,再次操作時,常常會報如下錯誤: ERROR 2013 (HY000): Lost connect

MySQLmyisaminnodb的主鍵索引有什麼區別

MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址。下圖是MyISAM索引的原理圖: 這裡設表一共有三列,假設我們以Col1為主鍵,則上圖是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引檔案

標籤 href onclick 的區別以及href="javascript:xxx(this);"與onclick="xxx(this);" 傳遞this引數的區別

<a>標籤中href屬性動作和onclick事件的區別,以及href="javascript:xxx(this);"與onclick="xxx(this);" 傳遞this引數的區別

mysqlexitin的區別

原文地址:https://segmentfault.com/a/1190000008709410 提前準備 為了大家學習方便,北哥在這裡面建立兩張表併為其新增一些資料 一張會員表,一張會員下單表。 會員表資料 id user email

在javascriptinnerHTMLinnerText的區別以及innerHTMLinnerText在各個版本瀏覽器的相容性問題

1. 在javascript中,首先我們來看innerHTML和innerText都可以用於獲取DOM元素中的內容。 我們可以這樣寫: (1)使用innerText時 在JS中我們, 從而得到

Java_Html_雜七雜八_路徑有/無/的區別.././的區別

Java/Html中 有/ 和 無/ 的區別。 Java專案中: 不加  /    就是獲取的當前路徑, 加    /      就是從根目錄 獲取子路徑(根目錄為WebRoot)。 解釋:通常在

mysqlchangemodify 的區別

這幾天一直想不明白這個問題。本來準備不想,但是實在放不下,看了一晚上,看了好多部落格,得出一點結論:大神勿噴!之前看過一篇部落格,說是modify 是修改微小的操作,而change是 修改和原來幅度比較大的,我覺得很正確先舉幾個例子: 將        資料表   deptm

mysqlinnodbmyisam的區別

InnoDB和MyISAM是很多人在使用MySQL時最常用的兩個表型別,這兩個表型別各有優劣,5.7之後就不一樣了 1、事務和外來鍵 InnoDB具有事務,支援4個事務隔離級別,回滾,崩潰修復能力和多版本併發的事務安全,包括ACID。如果應用中需要執行大量的INSERT或U

JavaScriptvar let的區別四個概念變數提升作用域重複宣告暫時死區以及從生命週期去看它

前言 今天無意當中遇到了js中的變數宣告,發現除了var居然還有let宣告方法,比較新奇,特地記錄下來它們兩者的區別!絕對能讓你理解清楚,PS 後面有重頭戲 思路 主要從四個角度來講述它們的區別 變數提升 作用域 重複宣告 暫時死區 變數提

JdbcTemplateexecuteupdate的區別 以及JdbcTemplate的增刪改查

1、update可以帶引數,而execute不可以。例如: jdbcTemplate.update("update TableA set name = 'Andy’ where id=?", new Object[] {new Integer(3)});  jdbc