Mysql中空值的概念及其作用_程序设计:你明白Mysql的Null值的背后含义和正确用法?...

本文探讨了MySQL中的NULL值与其在C++中的空指针NULL的区别。MySQL的NULL占用空间,且不等于任何其他值,用于表示未知或未指定的值。在C++中,NULL是整数0,可能导致函数重载混淆。C++11引入了nullptr以解决这一问题。了解这些差异对于理解数据库和程序设计至关重要。
摘要由CSDN通过智能技术生成

118922937_1_20171213103617768

最近银桑跟同事聊到一个问题,Mysql的null底层是什么呢?同事说是特殊的空字符串'',Oracle的Null确实是空字符串'',但对于Mysql可不好说,我觉得有些疑惑就去查了下Mysql的开发语言,居然是我由爱生恨的C++。。

C++中的Null

先来说说C++中的Null吧。

先说说空指针,是由系统来保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。

NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL;来使 p 成为一个空指针。(tyc:很多系统中的实现:#define NULL (void*)0,与这里的“a null pointer constant”并不是完全一致的)

在标准中并没有对空指针指向内存中的哪个地方做出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。

我们常见的空指针一般指向 0 地址,即空指针的内部用全 0 来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具体请参见C FAQ。

一般来说,在实际编程中不需要了解在我们的系统上空指针到底是一个 zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的。

在C语言中,NULL被定义为(void*)0,而在C++中,NULL被定义为整数0,编译器一般对其实际定义如下:

118922937_2_20171213103617893

出现C++和C定义不一致的原因是,在C++中不允许(void*)类型进行隐式转换,在C++中指针必须有明确的类型定义。不过也带来一个问题,在C++中NULL无法跟整数0进行区分,而且C++允许函数重载,如果同个函数名虽然参数类型不同,当以下情况输入NULL时,编译器分不清哪个函数执行时便会报错。

118922937_3_20171213103617955

所以C++11有了nullptr一个新的空指针的常量值,虽然实际使用还是会有一点问题,就不详聊了。

Mysql中的Null

先用Mysql试下Null和0的区别。

118922937_4_2017121310361818

Mysql中的NULL是占用空间的,下面是来自于MYSQL官方的解释。“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的Null跟C++的null是不同的,所以有了上面0和NULL的区别,MYSQL的官方文档中有提及过:NULL不等于任何其他值,它是未知的。

118922937_5_20171213103618158

NULL应该被认为是指“没有指定的值”或“未知的值”(意味不一定没有,0或”“意味着没有)。 所以,这并不意味着它没有用,它只是意味着你非正式地将一些特殊的语义附加到null值,比较类似于true Or False(isNull函数)或者我就是想占个位告诉自己这里是没有指定值。

Reference

https://mahmudahsan.wordpress.com/2009/01/10/mysql-null-vs-vs-null/

http://itindex.net/detail/49930-%E7%AC%94%E8%AE%B0-mysql-null

https://dev.mysql.com/doc/refman/5.7/en/null-values.html

https://dev.mysql.com/doc/refman/5.7/en/problems-with-null.html

专栏文章内容我会同步在https://graysilver.github.io/GraySilver-Page/

GitHub:https://github.com/GraySilver

上面是我的GitHub地址,里面有相关学习资源、文章以及机器学习视频教程,欢迎大家Follow和Star。

118922937_6_20171213103618268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值