NULL-safe equal null 索引 空字符串
小结
1、
mysql> INSERT INTO my_table (phone) VALUES (NULL); 有手机号但是不知道
mysql> INSERT INTO my_table (phone) VALUES ('');没有手机号
http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
SELECT 1=1,1=NULL,0=NULL,NULL=NULL;
1 NULL NULL NULL
SELECT 1<=>1,1<=>NULL,0<=>NULL,NULL<=>NULL;
1 0 0 1
NULL
-safe equal. This operator performs an equality comparison like the =
operator, but returns 1
rather than NULL
if both operands are NULL
, and 0
rather than NULL
if one operand is NULL
.
The <=>
operator is equivalent to the standard SQL IS NOT DISTINCT FROM
operator.
For row comparisons, (a, b) <=> (x, y)
is equivalent to:
(a <=> x) AND (b <=> y)
DEFAULT NULL
[SQL]UPDATE tab SET toutiaoid=NULL WHERE NOT toutiaoid>0;
受影响的行: 8
时间: 0.046s
[SQL]
ALTER TABLE tab ADD UNIQUE KEY (toutiaoid);
`toutiaoid` varchar(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '头条id',
默认为NULL的字段 可以加unique约束
https://dev.mysql.com/doc/refman/5.7/en/create-index.html
MySQL :: MySQL 8.0 Reference Manual :: B.4.4.3 Problems with NULL Values https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html
MySQL :: MySQL 8.0 Reference Manual :: 3.3.4.6 Working with NULL Values https://dev.mysql.com/doc/refman/8.0/en/working-with-null.html
3.3.4.6 Working with NULL Values
The NULL
value can be surprising until you get used to it. Conceptually, NULL
means “a missing unknown value”and it is treated somewhat differently from other values.
To test for NULL
, use the IS NULL
and IS NOT NULL
operators, as shown here:
mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
| 0 | 1 |
+-----------+---------------+
You cannot use arithmetic comparison operators such as =
, <
, or <>
to test for NULL
. To demonstrate this for yourself, try the following query:
mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
Because the result of any arithmetic comparison with NULL
is also NULL
, you cannot obtain any meaningful results from such comparisons.
In MySQL, 0
or NULL
means false and anything else means true. The default truth value from a boolean operation is 1
.
This special treatment of NULL
is why, in the previous section, it was necessary to determine which animals are no longer alive using death IS NOT NULL
instead of death <> NULL
.
Two NULL
values are regarded as equal in a GROUP BY
.
When doing an ORDER BY
, NULL
values are presented first if you do ORDER BY ... ASC
and last if you do ORDER BY ... DESC
.
A common error when working with NULL
is to assume that it is not possible to insert a zero or an empty string into a column defined as NOT NULL
, but this is not the case. These are in fact values, whereas NULL
means “not having a value.” You can test this easily enough by using IS [NOT] NULL
as shown:
mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
| 0 | 1 | 0 | 1 |
+-----------+---------------+------------+----------------+
Thus it is entirely possible to insert a zero or empty string into a NOT NULL
column, as these are in fact NOT NULL
. See Section B.4.4.3, “Problems with NULL Values”.
B.4.4.3 Problems with NULL Values
The concept of the NULL
value is a common source of confusion for newcomers to SQL, who often think that NULL
is the same thing as an empty string ''
. This is not the case. For example, the following statements are completely different:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');
Both statements insert a value into the phone
column, but the first inserts a NULL
value and the second inserts an empty string. The meaning of the first can be regarded as “phone number is not known” and the meaning of the second can be regarded as “the person is known to have no phone, and thus no phone number.”
To help with NULL
handling, you can use the IS NULL
and IS NOT NULL
operators and the IFNULL()
function.
In SQL, the NULL
value is never true in comparison to any other value, even NULL
. An expression that contains NULL
always produces a NULL
value unless otherwise indicated in the documentation for the operators and functions involved in the expression. All columns in the following example return NULL
:
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
To search for column values that are NULL
, you cannot use an expr = NULL
test. The following statement returns no rows, because expr = NULL
is never true for any expression:
mysql> SELECT * FROM my_table WHERE phone = NULL;
To look for NULL
values, you must use the IS NULL
test. The following statements show how to find the NULL
phone number and the empty phone number:
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = '';
See Section 3.3.4.6, “Working with NULL Values”, for additional information and examples.
You can add an index on a column that can have NULL
values if you are using the MyISAM
, InnoDB
, or MEMORY
storage engine. Otherwise, you must declare an indexed column NOT NULL
, and you cannot insert NULL
into the column.
When reading data with LOAD DATA
, empty or missing columns are updated with ''
. To load a NULL
value into a column, use \N
in the data file. The literal word NULL
may also be used under some circumstances. See Section 13.2.7, “LOAD DATA Statement”.
When using DISTINCT
, GROUP BY
, or ORDER BY
, all NULL
values are regarded as equal.
When using ORDER BY
, NULL
values are presented first, or last if you specify DESC
to sort in descending order.
Aggregate (summary) functions such as COUNT()
, MIN()
, and SUM()
ignore NULL
values. The exception to this isCOUNT(*)
, which counts rows and not individual column values. For example, the following statement produces two counts. The first is a count of the number of rows in the table, and the second is a count of the number of non-NULL
values in the age
column:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
For some data types, MySQL handles NULL
values specially. If you insert NULL
into a TIMESTAMP
column, the current date and time is inserted. If you insert NULL
into an integer or floating-point column that has the AUTO_INCREMENT
attribute, the next number in the sequence is inserted.
Target Server Type : MYSQL
Target Server Version : 80016
File Encoding : 65001
Date: 2020-03-16 08:28:00
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sum` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3334 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('23', '1');
INSERT INTO `test` VALUES ('333', null);
[SQL]update test set sum=sum+1 where id=333;
受影响的行: 0
时间: 0.012s
[SQL]
update test set sum=sum+1 where id=23;
受影响的行: 1
时间: 0.012s
对于null值增加失败。
NULL-safe equal null 索引 空字符串的更多相关文章
- ASP.NET MVC 下UpdateModel可空未填写的参数为Null,为何不是空字符串
查了好久,终于收到原因: if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && Object.Equals(valu ...
- Java空字符串与null的区别和判断字符串是否为空的方法
Java空字符串与null的区别: 1.类型null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也 ...
- Java进阶(二十一)java 空字符串与null区别
java 空字符串与null区别 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串, ...
- Django与SQL语言中——NULL与空字符串的区别
SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...
- 空字符串(“”)和null和空格字符串(" ")的区别
1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也就是说它的长度为0,但它是一个字符 ...
- Oracle中Null与空字符串' '的区别
含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...
- MySQL中NULL与空字符串
一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’ ’是相同的.这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的.NULL是指没有值,而”则表示值是存在的,只不过是个 ...
- Oracle中的null与空字符串''的区别
含义解释:问:什么是NULL?答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零.ORACLE允许任何一种数据类型的字段为空,除了以下 ...
- 指针数组 null与空字符串
指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便. 在c++中,null表示:对象为空,它是对指针而言的.而""表示:值为空,它是对字符串而言的.
随机推荐
- python序列(二)列表的删除操作
1.使用del命令删除列表中的指定位置上的元素 >>> s=[1,2,3,4] >>> del s[1] >>> s [1, 3, 4] 2.使用 ...
- Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片
关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...
- 技术选型关于redis客户端选择
redis作为分布式缓存框架的首选 相信已经毋庸置疑.能高效.合理的使用好它 必定能提升系统的可用性,高性能.高吞吐量的保障.但选择一个客户端,充分发挥它的能力,就是一个选型问题.现在市场上能选择 ...
- Vue——监听器watch
使用watch来侦听data中数据的变化,watch中的属性(watch是对象格式)一定是data 中已经存在的数据. 使用场景:数据变化时执行异步或开销比较大的操作. 典型应用:http://www ...
- 日常入坑1-Calendar类
1.当前时间是一号的时候,通过计算上一天的日期的时候,需要注意了 Calendar calendar = Calendar.getInstance();calendar.set(2019,10,1); ...
- js 的关键字
1.get / set var test = { _Name: "Limei", _Age: 20, get name() { return this._Name;}, set a ...
- String、StringBuffer 和 StringBuilder 的区别
面试简答 区别: 1) String 长度大小不可变 2) StringBuffer 和 StringBuilder 长度可变 3) StringBuffer 线程安全 StringBuilder 线 ...
- Azure Terraform(三)部署 Web 应用程序
一,引言 上一节关于 Terraform 的文章讲到 Terraform 使用到的一些语法,以及通过演示使用 Terraform 在Azure 上部署资源组,极大的方便了基础设施实施人员,也提高了基础 ...
- yolov5实战之皮卡丘检测
前言 从接触深度学习开始一直都做的是人脸识别,基本上也一直都在用mxnet. 记得之前在刚接触的时候看到博客中写到,深度学习分三个层次,第一个层次是分类,第二个层次是检测,第三个层次是分割.人脸识别算 ...
- Maven+Spring 框架,ModelAndView在页面取值不成功
如果创建的是maven project , maven生成的web.xml是这样的: 但是这样是不对的,应该修改成: 下面是代码: <?xml version="1.0" e ...