mysqlsql中的⼀些问题,Null与空字符
mysql中的空值,NULL,空字符
  Mysql数据库是⼀个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核⼼语⾔。不过在MySQL数据库中执⾏SQL语句,需要⼩⼼两个陷阱。
  陷阱⼀:空值不⼀定为空
  空值是⼀个⽐较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的⼀种特性。如在普通的字段中(字符型的数据),空值就是表⽰空值。但是如果将⼀个空值的数据插⼊到TimesTamp类型的字段中,空值就不⼀定为空。此时为出现什么情况呢
  我先创建了⼀个表。在这个表中有两个字段:User_id(其数据类型是int)、Date(其数据类型是TimesTamp)。现在往这个表中插⼊⼀条记录,其中往Date字段中插⼊的是⼀个NULL空值。可是当我们查询时,其结果显⽰的却是插⼊记录的当前时间。这是怎么⼀回事呢?其实这就是在MySQL数据库中执⾏SQL语句时经常会遇到的⼀个陷阱:空值不⼀定为空。在操作时,明明插⼊的是⼀个空值的数据,但是最后查询得到的却不是⼀个空值。
  在MySQL数据库中,NULL对于⼀些特殊类型的列来说,其代表了⼀种特殊的含义,⽽不仅仅是⼀个空
值。对于这些特殊类型的列,各位读者主要是要记住两个。⼀个就是笔者上⾯举的TimesTamp数据类型。如果往这个数据类型的列中插⼊Null值,则其代表的就是系统的当前时间。另外⼀个是具有auto_increment属性的列。如果往这属性的列中插⼊Null值的话,则系统会插⼊⼀个正整数序列。⽽如果在其他数据类型中,如字符型数据的列中插⼊Null的数据,则其插⼊的就是⼀个空值。
  陷阱⼆:空值不⼀定等于空字符
  在MySQL中,空值(Null)与空字符(’’)相同吗?答案是否定的。
  在同⼀个数据库表中,同时插⼊⼀个Null值的数据和⼀个’’空字符的数据,然后利⽤Select语句进⾏查询。显然其显⽰的结果是不相同的。从这个结果中就可以看出,空值不等于空字符。这就是在MySQL中执⾏SQL语句遇到的第⼆个陷阱。在实际⼯作中,空值数据与空字符往往表⽰不同的含义。员可以根据实际的需要来进⾏选择。如对于电话号码等字段,可以默认设置为空值(表⽰根本不知道对⽅的电话号码)或者设置为空字符(表⽰后来取消了这个号码)等等。由于他们在数据库中会有不同的表现形式,所以数据库管理员需要区别对待。笔者更加喜欢使⽤空值,⽽不是空字符。这主要是因为针对空值这个数据类型有⼏个⽐较特殊的运算字符。如果某个字段是空字符,数据库中是利⽤字段名称来代替。相反,如果插⼊的是空值,则直接显⽰的是NULL。这跟其他数据库的显⽰⽅式也是不同的。
  ⼀是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含⽤空值的数据,需要使⽤特殊的
关键字。其中前者表⽰这个字段为空,后者表⽰这个字段为⾮空。在Select语句的查询条件中这两个关键字⾮常的有⽤。如需要查询所有电话号码为空的⽤户(需要他们补充电话号码信息),就可以在查询条件中加⼊is not null关键字。
  ⼆是Count等统计函数,在空值上也有特殊的应⽤。如现在需要统计⽤户信息表中有电话号码的⽤户数量,此时就可以使⽤count函数、同时将电话号码作为参数来使⽤。因为在统计过程中,这个函数会⾃动忽略空值的数据。此时统计出来的就是有电话号码的⽤户信息。如果采⽤的是空字符的数据,则这个函数会将其统计进去。统计刚才建⽴的两条记录时,系统统计的结果是1,⽽不是2。可见系统⾃动将Null值的数据忽略掉了。
判断NULL⽤is null  或者 is not null。 sql语句⾥可以⽤ifnull函数来处理
判断空字符串‘’,要⽤ ='' 或者 <>''。sql语句⾥可以⽤if(col,col,0)处理,即:当col为true时(⾮null,及⾮'')显⽰,否则打印0
  平时我们在使⽤MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解。注意到NULL值是未知的,且占⽤空间,不⾛索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效率的事情的发⽣。
问题 1:⾸先,我们需要搞清楚 "空值" 和"NULL"的概念:
1:空值('')是不占⽤空间的
2: MySQL中的NULL其实是占⽤空间的。官⽅⽂档说明:
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
长度验证:注意空值的''之间是没有空格的。
mysql> select length(''),length(null),length('  ');
+------------+--------------+--------------+
| length('') | length(null) | length('  ') |
+------------+--------------+--------------+
|          0 |        NULL |            2 |
+------------+--------------+--------------+
问题2:
判断字段不为空的时候,查询语句到底是⽤ select * from  tablename  where columnname <> '' 还是⽤
select * from tablename where column is not null,2个查询语句有啥不同。
eg:
mysql> show create table testaa;
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table  | Create Table                                                                                                                                                        |
+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | testaa | CREATE TABLE `testaa` (
`a` int(11) NOT NULL,
`b` varchar(20) DEFAULT NULL,
`c` varchar(20) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
插⼊测试数据:
mysql> insert testaa  values (1,'aa','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (2,'','');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (3,null,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (4,NULL,'');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa  values (5,'aafa','fa');
Query OK, 1 row affected (0.00 sec)
mysql> insert testaa values (6,'',NULL);
ERROR 1048 (23000): Column 'c' cannot be null
mysql> select * from testaa;
+---+------+----+
| a | b    | c  |
+---+------+----+
| 1 | aa  |    |
| 2 |      |    |
| 3 | NULL |    |
| 4 | NULL |    |
| 5 | aafa | fa |
+---+------+----+
查询验证过程:
mysql> select * from testaa where c is not null;
+---+------+----+
| a | b    | c  |
+---+------+----+
| 1 | aa  |    |
| 2 |      |    |
| 3 | NULL |    |
| 4 | NULL |    |
| 5 | aafa | fa |
+---+------+----+
5 rows in set (0.00 sec)
mysql> select * from testaa where c <> '';
+---+------+----+
| a | b    | c  |
+---+------+----+
| 5 | aafa | fa |
+---+------+----+
1 row in set (0.00 sec)
mysql> select * from testaa  where c = '';
+---+------+---+
| a | b    | c |
+---+------+---+
| 1 | aa  |  |
| 2 |      |  |
| 3 | NULL |  |
| 4 | NULL |  |
+---+------+---+
4 rows in set (0.00 sec)
mysql> select * from testaa where  c is null;
Empty set (0.00 sec)
mysql> select * from testaa where b is not null;
+---+------+----+
| a | b    | c  |
+---+------+----+
| 1 | aa  |    |
| 2 |      |    |
| 5 | aafa | fa |
+---+------+----+
3 rows in set (0.00 sec)
mysql> select * from testaa where b <> '';
+---+------+----+
| a | b    | c  |
+---+------+----+
| 1 | aa  |    |
| 5 | aafa | fa |
+---+------+----+
2 rows in set (0.00 sec)
mysql> select * from testaa where b ='';
+---+------+---+
| a | b    | c |
+---+------+---+
| 2 |      |  |
+---+------+---+mysql操作官方文档
1 row in set (0.00 sec)
mysql> select * from testaa where  b is null;
+---+------+---+
| a | b    | c |
+---+------+---+
| 3 | NULL |  |
| 4 | NULL |  |
+---+------+---+
mysql> select length(b),length(c) from testaa;
+-----------+-----------+
| length(b) | length(c) |
+-----------+-----------+
| 2 | 0 |
| 0 | 0 |
| NULL | 0 |
| NULL | 0 |
| 4 | 2 |
+-----------+-----------+
5 rows in set (0.00 sec)
mysql> select count(b),count(c) from testaa;
+----------+----------+
| count(b) | count(c) |
+----------+----------+
| 3 | 5 |
+----------+----------+
1 row in set (0.00 sec)
mysql> create table testbb ( a int primary key , b timestamp);
Query OK, 0 rows affected (0.07 sec)
mysql> show create table testbb;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testbb | CREATE TABLE `testbb` (
`a` int(11) NOT NULL,
`b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql> insert into testbb vales (1,null) ;
mysql> insert into testbb values (2,'');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
mysql> select * from testbb;
+---+---------------------+
| a | b |
+---+---------------------+
| 1 | 2014-08-15 14:32:10 |
| 2 | 0000-00-00 00:00:00 |
+---+---------------------+
2 rows in set (0.00 sec)
注意事项:
1:在进⾏count()统计某列的记录数的时候,如果采⽤的NULL值,会别系统⾃动忽略掉,但是空值是会进⾏统计到其中的。
2:判断NULL ⽤IS NULL 或者 is not null,SQL 语句函数中可以使⽤ifnull()函数来进⾏处理,判断空字符⽤=''或者 <>''来进⾏处理
3: 对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插⼊的列插⼊NULL值,则出现的值是当前系统时间。插⼊空值,则会出现 '0000-00-00 00:00:00'
4:对于空值的判断到底是使⽤is null 还是 =''要根据实际业务来进⾏区分。
sql中,insert into与update语句,字符串要单引号括起

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。