Rumah pangkalan data tutorial mysql MySQL中NULL和NOT NULL详解

MySQL中NULL和NOT NULL详解

May 05, 2020 am 10:56 AM
mysql null

这篇小短文讲的是啥

之前看到有人问到 PHPHub 迁移数据库文件中 nullable 和索引的问题,相信很多用了 MySQL 很久的人(特别是平时过多关注业务开发的人),对这两个字段属性的概念还不是很清楚,一般会有以下疑问:

我字段类型是 not null,为什么我可以插入 空值;

为毛 not null 的效率比 null 高;

判断字段不为空的时候,到底要 column <> '' 还是要用 column is not null 呢。

带着上面几个疑问,我们来深入研究一下 null 和 not null 到底有什么不一样。

null 和 空值 一样么

首先,我们要搞清楚 空值 和 null 的概念:

空值 是不占用空间的;

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.

打个比方来说,你有一个杯子,空值代表杯子是真空的,NULL 代表杯子中装满了空气,虽然杯子看起来都是空的,但是区别是很大的。

一个小栗子

搞清楚 “空值” 和 “NULL” 的概念之后,问题基本就明了了,我们搞个例子测试一下:

CREATE TABLE  `test` (
     `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
     `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL
 ) ENGINE = MYISAM ;
Salin selepas log masuk

问题 1:我字段类型是 not null,为什么我可以插入 空值?

执行下面的 SQL,发生错误,提示 Column 'col1' cannot be null。

INSERT INTO `test` VALUES ( null, 1);
Salin selepas log masuk

再来一条,执行成功。

INSERT INTO `test` VALUES (&#39;&#39;,1);
Salin selepas log masuk

可见,NOT NULL 的字段是不能插入 NULL 的(这不是废话么 ),只能插入 空值,上面的问题 1 也就有答案了。

问题 2:为毛 not null 的效率比 null 高?

对于问题 2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以 mysql 在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。

而且 B 树索引时不会存储 NULL 值的,所以如果索引的字段可以为 NULL,索引的效率会下降很多。

问题 3:判断字段不为空的时候,到底要 column<>'' 还是要用 column is not null 呢。

我们再向 test 的表中插入几条数据:

INSERT INTO `test` VALUES (&#39;&#39;, NULL);
INSERT INTO `test` VALUES (&#39;1&#39;, &#39;2&#39;);
Salin selepas log masuk

现在根据需求,我要统计 test 表中 col1 不为空的所有数据,我是该用 <>'' 还是 IS NOT NULL 呢,让我们来看一下结果的区别。

现在表中的数据如下:

微信截图_20200505105438.png

分别对照以下两句 SQL 的执行效果

SELECT * FROM `test` WHERE col1 IS NOT NULL
Salin selepas log masuk

微信截图_20200505105447.png

SELECT * FROM `test` WHERE col1 <> &#39;&#39;
Salin selepas log masuk

微信截图_20200505105500.png

可以看到,结果迥然不同,所以我们一定要根据业务需求,搞清楚到底是要用那种搜索条件,以及要不要为 null。

自己遇到的一个小坑

在许久以前刚入职做第一个需求上线的时候,只一味注意到说是 not null 的效率比 null 的效率高。

好嘛~自己在现有的表上增加字段时全设置为了 not null,感觉自己屌屌的。

因为许多 Service 都有操作这个表的插入动作,结果可想而知,刚上线,错误 Column 'col1' cannot be null 弥漫了整个开发组每个人的邮箱。

所以,当业务量不是很大的情况下,很多技术的使用其实都需要根据实际状况综合考虑。

Atas ialah kandungan terperinci MySQL中NULL和NOT NULL详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

MySQL: Pengenalan kepada pangkalan data paling popular di dunia MySQL: Pengenalan kepada pangkalan data paling popular di dunia Apr 12, 2025 am 12:18 AM

MySQL adalah sistem pengurusan pangkalan data relasi sumber terbuka, terutamanya digunakan untuk menyimpan dan mengambil data dengan cepat dan boleh dipercayai. Prinsip kerjanya termasuk permintaan pelanggan, resolusi pertanyaan, pelaksanaan pertanyaan dan hasil pulangan. Contoh penggunaan termasuk membuat jadual, memasukkan dan menanyakan data, dan ciri -ciri canggih seperti Operasi Join. Kesalahan umum melibatkan sintaks SQL, jenis data, dan keizinan, dan cadangan pengoptimuman termasuk penggunaan indeks, pertanyaan yang dioptimumkan, dan pembahagian jadual.

Cara menggunakan redis berulir tunggal Cara menggunakan redis berulir tunggal Apr 10, 2025 pm 07:12 PM

Redis menggunakan satu seni bina berulir untuk memberikan prestasi tinggi, kesederhanaan, dan konsistensi. Ia menggunakan I/O multiplexing, gelung acara, I/O yang tidak menyekat, dan memori bersama untuk meningkatkan keserasian, tetapi dengan batasan batasan konkurensi, satu titik kegagalan, dan tidak sesuai untuk beban kerja yang berintensifkan.

Mengapa menggunakan mysql? Faedah dan kelebihan Mengapa menggunakan mysql? Faedah dan kelebihan Apr 12, 2025 am 12:17 AM

MySQL dipilih untuk prestasi, kebolehpercayaan, kemudahan penggunaan, dan sokongan komuniti. 1.MYSQL Menyediakan fungsi penyimpanan dan pengambilan data yang cekap, menyokong pelbagai jenis data dan operasi pertanyaan lanjutan. 2. Mengamalkan seni bina pelanggan-pelayan dan enjin penyimpanan berganda untuk menyokong urus niaga dan pengoptimuman pertanyaan. 3. Mudah digunakan, menyokong pelbagai sistem operasi dan bahasa pengaturcaraan. 4. Mempunyai sokongan komuniti yang kuat dan menyediakan sumber dan penyelesaian yang kaya.

Tempat Mysql: Pangkalan Data dan Pengaturcaraan Tempat Mysql: Pangkalan Data dan Pengaturcaraan Apr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Pantau titisan redis dengan perkhidmatan pengeksport redis Pantau titisan redis dengan perkhidmatan pengeksport redis Apr 10, 2025 pm 01:36 PM

Pemantauan yang berkesan terhadap pangkalan data REDIS adalah penting untuk mengekalkan prestasi yang optimum, mengenal pasti kemungkinan kesesakan, dan memastikan kebolehpercayaan sistem keseluruhan. Perkhidmatan Pengeksport Redis adalah utiliti yang kuat yang direka untuk memantau pangkalan data REDIS menggunakan Prometheus. Tutorial ini akan membimbing anda melalui persediaan lengkap dan konfigurasi perkhidmatan pengeksport REDIS, memastikan anda membina penyelesaian pemantauan dengan lancar. Dengan mengkaji tutorial ini, anda akan mencapai tetapan pemantauan operasi sepenuhnya

Cara Melihat Ralat Pangkalan Data SQL Cara Melihat Ralat Pangkalan Data SQL Apr 10, 2025 pm 12:09 PM

Kaedah untuk melihat ralat pangkalan data SQL adalah: 1. Lihat mesej ralat secara langsung; 2. Gunakan kesilapan menunjukkan dan menunjukkan perintah amaran; 3. Akses log ralat; 4. Gunakan kod ralat untuk mencari punca kesilapan; 5. Semak sambungan pangkalan data dan sintaks pertanyaan; 6. Gunakan alat debugging.

Cara menyambung ke pangkalan data Apache Cara menyambung ke pangkalan data Apache Apr 13, 2025 pm 01:03 PM

Apache menyambung ke pangkalan data memerlukan langkah -langkah berikut: Pasang pemacu pangkalan data. Konfigurasikan fail web.xml untuk membuat kolam sambungan. Buat sumber data JDBC dan tentukan tetapan sambungan. Gunakan API JDBC untuk mengakses pangkalan data dari kod Java, termasuk mendapatkan sambungan, membuat kenyataan, parameter mengikat, melaksanakan pertanyaan atau kemas kini, dan hasil pemprosesan.

See all articles