【MySQL】 IS NOT NULL 和 != NULL 的区别?

背景

最近在开发小伙伴的需求,遇到了一个数据库统计的问题,
is not null 结果正确
!=null 结果就不对,然后就激发了获取真理的想法,那必须的查查
咋回事嘞?
在这里插入图片描述

开整

在用MySQL的过程中,你是否存在过如下的几个疑问?

  • 我的字段类型明明指定的是NOT NULL,但是为什么还是可以插入空值呢?
  • 为什么NOT NULL的效率比NULL更高?
  • 在查询空字段的记录时是用"select * from table where col <> ‘’ “还是用"select * from table where col is not null”?

带着疑问,我们来看看NOT NULL和NULL有什么不一样呢?要搞清楚这两个的区别。首先,我们先要理解"空值"和"NULL"的含义:

  • 空值是不占用空间的。
  • NULL是会占用空间的,我们来看看官方对这个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也会占用空间了吧。

下面来通过一个实例例子来测试一下。首先建一个表,表引擎使用InnoDB,建表语句如下:

create table test(
  c1 varchar(10) not null, 
  c2 varchar(10) default null
) engine = InnoDB;

验证插入数据和查询:

mysql> insert into test(c1, c2) values(null, 0);
ERROR 1048 (23000): Column 'c1' cannot be null

mysql> insert into test(c1, c2) values('', 0);
Query OK, 1 row affected (0.00 sec)
# null字符串
mysql> insert into test(c1, c2) values('null', 0);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test(c1, c2) values('', null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+------+
| c1   | c2   |
+------+------+
|      | 0    |
| null | 0    |
|      | NULL |
+------+------+
3 rows in set (0.00 sec)

从上述结果中可以看到,NOT NULL的字段是没办法插入NULL值的,只能插入空值’'。上面第三个SQL插入的NULL是个字符串格式的NULL,对于MyISAM的存储引擎,测试的结果和上述结果是一样的。所以第1个疑问也就了解了吧。

对于第2个问题,因为NULL值是占了一定空间的,所以在MySQL进行字段比较的时候,值为NULL的字段也是会参与比较的,所以是会对性能有一定的影响。

当字段上包含有索引时,由于B树索引是不会存储NULL值的,所以在使用这个字段做为查询条件时,对性能的影响还是比较大的,在平时创建索引的时候,应该尽量保证列的值不为NULL。

针对上述的结论,有几个针对NULL和NOT NULL的常见优化建议:

  • MySQL如果不指定列的约束,默认就是允许NULL,TIMESTAMP类型的字段除外。所以在非必要情况下,尽量设置列的约束为NOT NULL。
  • 如果列的值为NULL,通过这个为NULL的列进行条件查询时,MySQL更难做优化,因为为NULL的列会让索引的统计和值的比较更加复杂。
  • 如果计划在某个列上创建索引,那么需要尽量避免这个列中的字段值为NULL。在优化的过程中,把NULL改为NOT NULL对性能的提升并不是很明显。所以如果在使用过程中没有问题的话,没有必要首先去做NULL到NOT NULL的优化。

来通过实际例子看看最后一个问题。假如需要查询上述test表中c1不为空的所有数据,应该使用"<> ‘’"呢?还是使用"IS NOT NULL"呢?测试结果如下:

mysql> select * from test where c1 is not null;
+------+------+
| c1   | c2   |
+------+------+
|      | 1    |
| null | 1    |
|      | NULL |
+------+------+
3 rows in set (0.00 sec)

mysql> select * from test where c1 <> '';
+------+------+
| c1   | c2   |
+------+------+
| null | 1    |
+------+------+
1 row in set (0.00 sec)

可以看到,不同的查询条件,对于查询的结果区别还是特别大的。所以在使用过程中需要根据业务场景,选择不同的查询条件。

附录

附录1:MySQL索引失效的常见情况

  1. 最左前缀原则。例如:存在联合索引idx_a_b(a, b),查询条件使用where b = 1则无法使用索引
  2. LIKE 前置模糊查询。例如:col_name like '%test'col_name like '%test%'
  3. 索引列使用函数或存在计算。例如:存在索引idx_col(col),查询条件使用where left(col, 2) = 'te'
  4. 查询条件使用 is not null。设计表结构时尽量设置 not null约束
  5. 字段类型出现隐式转换。例如:存在字段test_colvarchar类型,查询时使用了where test_col = 1,隐式转为了int类型导致索引失效
  6. 条件中有 or 存在可能不会使用索引。例如:查询条件为where a = 'testa' or b = 'testb',存在索引idx_a(a),此时也不会使用索引,除非为b字段也添加索引
  7. 查询结果超过整体结果的25%或三分之一,或者表数据量比较少时,MySQL认为全表扫描代价更小,会导致索引失效

附录2:MySQL关键字列表

R 表示为 MySQL 预留关键字

关键字关键字关键字
ACCESSIBLE(R)ACCOUNTACTION
ADD(R)AFTERAGAINST
AGGREGATEALGORITHMALL(R)
ALTER(R)ALWAYSANALYSE
ANALYZE(R)AND(R)ANY
AS(R)ASC(R)ASCII
ASENSITIVE(R)ATAUTOEXTEND_SIZE
AUTO_INCREMENTAVGAVG_ROW_LENGTH
BACKUPBEFORE(R)BEGIN
BETWEEN(R)BIGINT(R)BINARY(R)
BINLOGBITBLOB(R)
BLOCKBOOLBOOLEAN
BOTH(R)BTREEBY(R)
BYTECACHECALL ®
CASCADE ®CASCADEDCASE ®
CATALOG_NAMECHAINCHANGE ®
CHANGEDCHANNELCHAR ®
CHARACTER ®CHARSETCHECK ®
CHECKSUMCIPHERCLASS_ORIGIN
CLIENTCLOSECOALESCE
CODECOLLATE ®COLLATION
COLUMN ®COLUMNSCOLUMN_FORMAT
COLUMN_NAMECOMMENTCOMMIT
COMMITTEDCOMPACTCOMPLETION
COMPRESSEDCOMPRESSIONCONCURRENT
CONDITION ®CONNECTIONCONSISTENT
CONSTRAINT ®CONSTRAINT_CATALOGCONSTRAINT_NAME
CONSTRAINT_SCHEMACONTAINSCONTEXT
CONTINUE ®CONVERT ®CPU
CREATE ®CROSS ®CUBE
CURRENTCURRENT_DATE ®CURRENT_TIME ®
CURRENT_TIMESTAMP ®CURRENT_USER ®CURSOR ®
CURSOR_NAMEDATADATABASE ®
DATABASES ®DATAFILEDATE
DATETIMEDAYDAY_HOUR ®
DAY_MICROSECOND ®DAY_MINUTE ®DAY_SECOND ®
DEALLOCATEDEC ®DECIMAL ®
DECLARE ®DEFAULT ®DEFAULT_AUTH
DEFINERDELAYED ®DELAY_KEY_WRITE
DELETE ®DESC ®DESCRIBE ®
DES_KEY_FILEDETERMINISTIC ®DIAGNOSTICS
DIRECTORYDISABLEDISCARD
DISKDISTINCT ®DISTINCTROW ®
DIV ®DODOUBLE ®
DROP ®DUAL ®DUMPFILE
DUPLICATEDYNAMICEACH ®
ELSE ®ELSEIF ®ENABLE
ENCLOSED ®ENCRYPTIONEND
ENDSENGINEENGINES
ENUMERRORERRORS
ESCAPEESCAPED ®EVENT
EVENTSEVERYEXCHANGE
EXECUTEEXISTS ®EXIT ®
EXPANSIONEXPIREEXPLAIN ®
EXPORTEXTENDEDEXTENT_SIZE
FALSE ®FASTFAULTS
FETCH ®FIELDSFILE
FILE_BLOCK_SIZEFILTERFIRST
FIXEDFLOAT(R)FLOAT4(R)
FLOAT8(R)FLUSHFOLLOWS
FOR(R)FORCE(R)FOREIGN(R)
FORMATFOUNDFROM(R)
FULLFULLTEXT(R)FUNCTION
GENERALGENERATED(R)GEOMETRY
GEOMETRYCOLLECTIONGET(R)GET_FORMAT
GLOBALGRANT(R)GRANTS
GROUP(R)GROUP_REPLICATIONHANDLER
HASHHAVING(R)HELP
HIGH_PRIORITY(R)HOSTHOSTS
HOURHOUR_MICROSECOND(R)HOUR_MINUTE(R)
HOUR_SECOND(R)IDENTIFIEDIF(R)
IGNORE(R)IGNORE_SERVER_IDSIMPORT
IN(R)INDEX(R)INDEXES
INFILE(R)INITIAL_SIZEINNER(R)
INOUT(R)INSENSITIVE(R)INSERT(R)
INSERT_METHODINSTALLINSTANCE
INT(R)INT1(R)INT2(R)
INT3(R)INT4(R)INT8(R)
INTEGER(R)INTERVAL(R)INTO(R)
INVOKERIOIO_AFTER_GTIDS(R)
IO_BEFORE_GTIDS(R)IO_THREADIPC
IS(R)ISOLATIONISSUER
ITERATE(R)JOIN(R)JSON
KEY(R)KEYS(R)KEY_BLOCK_SIZE
KILL(R)LANGUAGELAST
LEADING(R)LEAVE ®LEAVES
LEFT ®LESSLEVEL
LIKE ®LIMIT ®LINEAR(R)
LINES(R)LINESTRINGLIST
LOAD(R)LOCALLOCALTIME(R)
LOCALTIMESTAMP(R)LOCK(R)LOCKS
LOGFILELOGSLONG(R)
LONGBLOB(R)LONGTEXT(R)LOOP(R)
LOW_PRIORITY(R)MASTERMASTER_AUTO_POSITION
MASTER_BIND(R)MASTER_CONNECT_RETRYMASTER_DELAY
MASTER_HEARTBEAT_PERIODMASTER_HOSTMASTER_LOG_FILE
MASTER_LOG_POSMASTER_PASSWORDMASTER_PORT
MASTER_RETRY_COUNTMASTER_SERVER_IDMASTER_SSL
MASTER_SSL_CAMASTER_SSL_CAPATHMASTER_SSL_CERT
MASTER_SSL_CIPHERMASTER_SSL_CRLMASTER_SSL_CRLPATH
MASTER_SSL_KEYMASTER_SSL_VERIFY_SERVER_CERT(R)MASTER_TLS_VERSION
MASTER_USERMATCH(R)MAXVALUE(R)
MAX_CONNECTIONS_PER_HOURMAX_QUERIES_PER_HOURMAX_ROWS
MAX_SIZEMAX_STATEMENT_TIMEMAX_UPDATES_PER_HOUR
MAX_USER_CONNECTIONSMEDIUMMEDIUMBLOB(R)
MEDIUMINT(R)MEDIUMTEXT(R)MEMORY
MERGEMESSAGE_TEXTMICROSECOND
MIDDLEINT(R)MIGRATEMINUTE
MINUTE_MICROSECOND(R)MINUTE_SECOND(R)MIN_ROWS
MOD(R)MODEMODIFIES(R)
MODIFYMONTHMULTILINESTRING
MULTIPOINTMULTIPOLYGONMUTEX
MYSQL_ERRNONAMENAMES
NATIONALNATURAL(R)NCHAR
NDBNDBCLUSTERNEVER
NEWNEXTNO
NODEGROUPNONBLOCKINGNONE
NOT(R)NO_WAITNO_WRITE_TO_BINLOG(R)
NULL(R)NUMBERNUMERIC(R)
NVARCHAROFFSETOLD_PASSWORD
ON(R)ONEONLY
OPENOPTIMIZE(R)OPTIMIZER_COSTS(R)
OPTION(R)OPTIONALLY(R)OPTIONS
OR(R)ORDER(R)OUT(R)
OUTER(R)OUTFILE(R)OWNER
PACK_KEYSPAGEPARSER
PARSE_GCOL_EXPRPARTIALPARTITION(R)
PARTITIONINGPARTITIONSPASSWORD
PHASEPLUGINPLUGINS
PLUGIN_DIRPOINTPOLYGON
PORTPRECEDESPRECISION(R)
PREPAREPRESERVEPREV
PRIMARY(R)PRIVILEGESPROCEDURE(R)
PROCESSLISTPROFILEPROFILES
PROXYPURGE(R)QUARTER
QUERYQUICKRANGE(R)
READ(R)READS(R)READ_ONLY
READ_WRITE(R)REAL(R)REBUILD
RECOVERREDOFILEREDO_BUFFER_SIZE
REDUNDANTREFERENCES(R)REGEXP(R)
RELAYRELAYLOGRELAY_LOG_FILE
RELAY_LOG_POSRELAY_THREADRELEASE(R)
RELOADREMOVERENAME(R)
REORGANIZEREPAIRREPEAT(R)
REPEATABLEREPLACE(R)REPLICATE_DO_DB
REPLICATE_DO_TABLEREPLICATE_IGNORE_DBREPLICATE_IGNORE_TABLE
REPLICATE_REWRITE_DBREPLICATE_WILD_DO_TABLEREPLICATE_WILD_IGNORE_TABLE
REPLICATIONREQUIRE(R)RESET
RESIGNAL(R)RESTORERESTRICT(R)
RESUMERETURN(R)RETURNED_SQLSTATE
RETURNSREVERSEREVOKE(R)
RIGHT(R)RLIKE(R)ROLLBACK
ROLLUPROTATEROUTINE
ROWROWSROW_COUNT
ROW_FORMATRTREESAVEPOINT
SCHEDULESCHEMA(R)SCHEMAS(R)
SCHEMA_NAMESECONDSECOND_MICROSECOND(R)
SECURITYSELECT(R)SENSITIVE(R)
SEPARATOR(R)SERIALSERIALIZABLE
SERVERSESSIONSET(R)
SHARESHOW(R)SHUTDOWN
SIGNAL(R)SIGNEDSIMPLE
SLAVESLOWSMALLINT(R)
SNAPSHOTSOCKETSOME
SONAMESOUNDSSOURCE
SPATIAL ®SPECIFIC ®SQL ®
SQLEXCEPTION ®SQLSTATE ®SQLWARNING ®
SQL_AFTER_GTIDSSQL_AFTER_MTS_GAPSSQL_BEFORE_GTIDS
SQL_BIG_RESULT(R)SQL_BUFFER_RESULTSQL_CACHE
SQL_CALC_FOUND_ROWS(R)SQL_NO_CACHESQL_SMALL_RESULT(R)
SQL_THREADSQL_TSI_DAYSQL_TSI_HOUR
SQL_TSI_MINUTESQL_TSI_MONTHSQL_TSI_QUARTER
SQL_TSI_SECONDSQL_TSI_WEEKSQL_TSI_YEAR
SSL(R)STACKEDSTART
STARTING(R)STARTSSTATS_AUTO_RECALC
STATS_PERSISTENTSTATS_SAMPLE_PAGESSTATUS
STOPSTORAGESTORED(R)
STRAIGHT_JOIN(R)STRINGSUBCLASS_ORIGIN
SUBJECTSUBPARTITIONSUBPARTITIONS
SUPERSUSPENDSWAPS
SWITCHESTABLE(R)TABLES
TABLESPACETABLE_CHECKSUMTABLE_NAME
TEMPORARYTEMPTABLETERMINATED(R)
TEXTTHANTHEN(R)
TIMETIMESTAMPTIMESTAMPADD
TIMESTAMPDIFFTINYBLOB(R)TINYINT(R)
TINYTEXT(R)TO(R)TRAILING(R)
TRANSACTIONTRIGGER ®TRIGGERS
TRUE ®TRUNCATETYPE
TYPESUNCOMMITTEDUNDEFINED
UNDO(R)UNDOFILEUNDO_BUFFER_SIZE
UNICODEUNINSTALLUNION(R)
UNIQUE(R)UNKNOWNUNLOCK(R)
UNSIGNED(R)UNTILUPDATE(R)
UPGRADEUSAGE(R)USE(R)
USERUSER_RESOURCESUSE_FRM
USING(R)UTC_DATE(R)UTC_TIME(R)
UTC_TIMESTAMP(R)VALIDATIONVALUE
VALUES(R)VARBINARY(R)VARCHAR(R)
VARCHARACTER(R)VARIABLESVARYING(R)
VIEWVIRTUAL(R)WAIT
WARNINGSWEEKWEIGHT_STRING
WHEN(R)WHERE(R)WHILE(R)
WITH(R)WITHOUTWORK
WRAPPERWRITE(R)X509
XAXIDXML
XOR(R)YEARYEAR_MONTH(R)
ZEROFILL(R)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28053.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞

目录 1.力做功 恒力作用下的功 变力的功 2.动能定理 3.保守力与非保守力 4.势能 引力的功与弹力的功 引力势能与弹性势能 5.保守力做功与势能的关系 6.机械能守恒定律 7.完全弹性碰撞 题1 题目描述 题解 题2 题目描述 题解 1.力做功 物体在力作用下移动做功…

AWS CodeWhisperer 简单介绍

一、何为AWS CodeWhisperer Amazon CodeWhisperer能够理解以自然语言&#xff08;英语&#xff09;编写的注释&#xff0c;并能实时生成多条代码建议&#xff0c; 以此提高开发人员生产力。 二、主要功能 Amazon CodeWhisperer 的主要功能&#xff0c;包括代码生成、引用追踪…

36.SpringBoot实用篇—运维

目录 一、实用篇—运维。 &#xff08;1&#xff09;程序打包与运行&#xff08;Windows版&#xff09;。 &#xff08;2&#xff09;spring-boot-maven-plugin插件作用。 &#xff08;3&#xff09;程序打包与运行&#xff08;Linux版&#xff09;。 &#xff08;4&#…

chatgpt赋能python:Python中如何处理多个输入

Python中如何处理多个输入 在编写Python程序时&#xff0c;我们经常需要从用户那里获取多个输入来执行某些操作。本文将介绍Python中的各种方法来处理多个输入。 从终端获取多个输入 Python中最简单的方式是从终端获取多个输入。下面是一个基本的例子&#xff1a; input_st…

SpringSecurity实现前后端分离登录token认证详解

目录 1. SpringSecurity概述 1.1 权限框架 1.1.1 Apache Shiro 1.1.2 SpringSecurity 1.1.3 权限框架的选择 1.2 授权和认证 1.3 SpringSecurity的功能 2.SpringSecurity 实战 2.1 引入SpringSecurity 2.2 认证 2.2.1 登录校验流程 2.2.2 SpringSecurity完整流程 2.2.…

Splashtop 与 Pax8 合作为 MSP 提供简化的远程支持解决方案

2023年4月27日 科罗拉多州丹佛 Pax8 是一个行业领先的云商务市场&#xff0c;该公司今天宣布将通过 Pax8 市场在全球推出其全新运营供应商 Splashtop。Splashtop 的远程访问、支持以及端点监控和管理解决方案极具成本效益&#xff0c;而且功能强大&#xff0c;可以助力托管服务…

002、体系结构之TiDB Server

TiDB Server 1、TiDB总览1.1、TiDB Server架构1.2、TiDB Server 主要功能&#xff1a; 2、SQL语句处理语句的解析和编译SQL层协议层上下文解析层逻辑优化器物理优化器本地执行器分布式执行器 3、如何将表的数据转成kv形式4、在线DDL相关模块5、GC机制与相关模块6、TiDB Server …

你真的会写软件测试简历吗?为什么面试约不到,测试老鸟的建议...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 写好一份简历的三…

Frida技术—逆向开发的屠龙刀

简介 Frida是一种基于JavaScript的动态分析工具&#xff0c;可以用于逆向开发、应用程序的安全测试、反欺诈技术等领域。Frida主要用于在已安装的应用程序上运行自己的JavaScript代码&#xff0c;从而进行动态分析、调试、修改等操作&#xff0c;能够绕过应用程序的安全措施&a…

mac下部署和访问 Kubernetes 仪表板(Dashboard)

简介 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者修改 Kub…

QT--配置Opencv

提示&#xff1a;本文为学习记录&#xff0c;若有疑问&#xff0c;请及时联系作者。 文章目录 前言一、下载已编译的opencv1..解压2..path路径 二、使用步骤1..pro文件2..h文件 总结 前言 只做第一个我&#xff0c;不做第二个谁。 一、下载已编译的opencv 适用于mingw编译器…

NoSQL数据库

NoSQL数据库 NoSQL简介NoSQL兴起的原因NoSQL与关系数据库的对比NoSQL的四大类型键值数据库列族数据库文档数据库图形数据库不同类型数据库比较分析RedisMongoDBCassandraNeo4j NoSQL三大基石CAPBASE最终一致性 NoSQL简介 “Not Only SQL”泛指非关系型的数据库&#xff0c;区别…

07_scrapy的应用——获取电影数据(通过excel保存静态页面scrapy爬虫数据的模板/通过数据库保存)

0、前言: 一般我们自己创建的一些python项目,我们都需要创建虚拟环境,其中会下载很多包,也叫做依赖。但是我们在给他人分享我们的项目时,不能把虚拟环境打包发送给别人,因为每个人电脑系统不同,我们可以把依赖导出为依赖清单,然后别人有了我们的依赖清单,就可以用一条…

项目使用tensorflow2会出错,下载并使用tensorflow1

背景&#xff1a;使用pycharm安装总显示安装失败&#xff0c;使用pip安装也不行&#xff0c;只能使用conda配置虚拟环境手动安装 1、下载安装anaconda 官网下载&#xff0c;双击安装。用anaconda就是想使用虚拟环境&#xff0c;万一没弄好直接删了重新搞就行。 2、创建虚拟环境…

Https加密超文本传输协议的运用

1.https的相关知识 1.1 https的简介 HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加…

使用POI实现JAVA操作Excel

Apache POI POI提供API给JAVA程序对Microsoft Office格式档案读和写的功能 POI工具介绍 POI 是用Java编写的免费开源的跨平台的 Java API&#xff0c;Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。主要是运用其中读取和输出excel的功能。 POI官网地…

常用设计模式(三)

接着之前的思路今天来介绍一下常用的设计模式有哪些 单例模式&#xff08;Singleton Pattern&#xff09; 又称为单体模式&#xff0c;保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点。也就是说&#xff0c;第二次使用同一个类创建新对象的时候&#xff0c…

es相关的知识点

海量数据下如何提升es的操作性能 .filesystemcache os cache操作系统缓存 es中的数据,实际上写入磁盘,磁盘文件的操作系统,实际上会将数据写入到oscache中 es的搜索引擎严重依赖于底层的filesystemcache 如果filesystemcache的内存足够大,可以容纳所有的index segmentfile索引…

ABB CI546 3BSE012545R1 模块

ABB CI546 3BSE012545R1 模块. ABB CI546 3BSE012545R1 模块 电子电工技术的电力系统分析 1电子电工技能特色 电子电工技能是凭仗计算机技能开展起来的&#xff0c;并朝着智能化、网络化的方向开展。随着时代的开展&#xff0c;新式技能不断涌现&#xff0c;使传统电工技能运用…

基于 opencv 的人脸识别上课考勤系统,附源码,可作为毕业设计

一、简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的。 项目使用Python实现&#xff0c;基于OpenCV框架进行人脸识别和摄像头硬件调用&#xff0c;同时也用OpenCV工具包处理图片。交互界面使用pyqt5实现。 该系统实现了从学生信息输入、人脸数据…