当前位置: 首页 > news >正文

深度分析Oracle中的NULL

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

关键点

特殊值NULL意味着没有数据,它声明了该值是未知的事实。默认情况下,任何类型的列和变量都可以取这个值,除非它们有一个NOT NULL约束。此外,数据库管理系统会自动向包含在表的主键中的列添加NOT NULL约束。

NULL的主要特点是它不等于任何东西,甚至不等于另一个NULL。你不能使用任何操作符:=, <, >, like...与它比较任何值。即使表达式NULL != NULL也不会为真,因为不能唯一地将一个未知数与另一个未知数进行比较。顺便说一句,这个表达式也不会是假的,因为在计算条件时,Oracle不仅限于TRUE和FALSE状态。由于存在NULL这种不确定性元素的形式,还有一个状态 —— UNKNOWN。

因此,Oracle不是使用双值逻辑,而是使用三值逻辑操作。这个特点是由Codd祖父在他的关系理论中提出的,作为一个关系型数据库管理系统,Oracle完全遵循他的教诲。为了不对查询的“奇怪”结果进行思考,开发者需要知道三值逻辑的真值表。

为了方便,我们将制作一个输出布尔参数状态的程序:

procedure testBool( p_bool in boolean ) isbegin  if p_bool = true then     dbms_output.put_line('TRUE');  elsif p_bool = false then    dbms_output.put_line('FALSE');  else     dbms_output.put_line('UNKNOWN');  end if;     end;

熟悉的比较操作符对于NULL是让步的:

exec testBool( null  = null );  -- UNKNOWNexec testBool( null != null );  -- UNKNOWNexec testBool( null  = 'a'  );  -- UNKNOWNexec testBool( null != 'a'  );  -- UNKNOWN

与NULL的比较 

有特殊的操作符,IS NULL 和 IS NOT NULL,它们允许与NULL进行比较。如果操作数是NULL,IS NULL会返回真;如果不是,它会返回假。

select case when null is null then 'YES' else 'NO' end from dual; -- YESselect case when 'a'  is null then 'YES' else 'NO' end from dual; -- NO

相应地,IS NOT NULL做相反的操作:如果操作数的值非NULL,它将返回真;如果它是NULL,它将返回假:

select case when 'a'  is NOT null then 'YES' else 'NO' end from dual; -- YESselect case when null is NOT null then 'YES' else 'NO' end from dual; -- NO

此外,关于与缺失值的比较还有几个例外。第一个是DECODE函数,它认为两个NULL是等价的。其次是复合索引:如果两个键包含空字段,但它们所有的非空字段都相等,那么Oracle会认为这两个键是等价的。

DECODE违反了这个系统:

select decode( null  , 1, 'ONE'  , null, 'EMPTY' -- это условие будет истинным   , 'DEFAULT'    )from dual;

布尔操作和NULL 

通常,UNKNOWN状态与FALSE处理方式相同。例如,如果从表中选择行,WHERE子句中的x = NULL条件评估为UNKNOWN,那么你不会得到任何行。但是,有一个区别:如果表达式NOT(FALSE)返回真,则NOT(UNKNOWN)返回UNKNOWN。逻辑操作符AND和OR在处理未知状态时也有它们自己的特点。在下面的示例中有具体说明。

在大多数情况下,未知的结果被视为FALSE:

select 1 from dual where dummy = null; -- query will not return result

未知的否定给出未知:

exec testBool( not(null  = null) ); -- UNKNOWNexec testBool( not(null != null) ); -- UNKNOWNexec testBool( not(null  = 'a')  ); -- UNKNOWNexec testBool( not(null != 'a')  ); -- UNKNOWN

或运算符:

exec testBool( null or true  );   -- TRUE    <- !!!!!exec testBool( null or false );   -- UNKNOWNexec testBool( null or null  );   -- UNKNOWN

与运算符:

exec testBool( null and true  );  -- UNKNOWNexec testBool( null and false );  -- FALSE   <- !!!!!exec testBool( null and null  );  -- UNKNOWN

IN 和 NOT IN 运算符 

我们从一些初步的步骤开始。为了测试,让我们创建一个表T,它有一个数字列A和四行:1、2、3和NULL。

create table t as select column_value a from table(sys.odcinumberlist(1,2,3,null));

启用请求追踪(您必须拥有PLUSTRACE角色才能执行此操作)。

在跟踪的列表中,只留下过滤部分,以显示请求中指定的条件是如何展开的。

set autotrace on

初步工作结束了。现在让我们使用运算符。让我们试着选择所有包含在集合(1, 2, NULL)中的记录:

select * from t where a in ( 1, 2, null ); -- will return [1, 2]-- Predicate Information: --   filter("A"=1 OR "A"=2 OR "A"=TO_NUMBER(NULL))

如您所见,带有NULL的行没有被选中。这是因为谓词"A"=TO_NUMBER(NULL)的评估返回了UNKNOWN状态。为了在查询结果中包含NULL,您必须明确指定它:

select * from t where a in ( 1, 2 ) or a is null; -- will return [1, 2, NULL]-- Predicate Information: --    filter("A" IS NULL OR "A"=1 OR "A"=2)

现在我们试试NOT IN:

select * from t where a not in ( 1, 2, null ); -- no rows selected-- Predicate Information:--   filter("A"<>1 AND "A"<>2 AND "A"<>TO_NUMBER(NULL))

一个结果都没有!让我们看看为什么三元组没有包含在查询结果中。让我们手动计算DBMS为A=3情况应用的过滤器:

由于三值逻辑的特点,NOT IN 对NULL一点也不友好:只要NULL进入选择条件,就不要等待数据。

NULL 和空字符串 

在这里,Oracle偏离了ANSI SQL标准,并声明NULL和空字符串是等价的。这也许是最具争议的特点之一,时不时地会引发多页的讨论,转向个性化的争辩和其他艰难争论的必要属性。从文档来看,Oracle本身似乎不介意改变这种情况(它说即使现在,空字符串被视为NULL,这在未来版本中可能会改变),但今天为这个DBMS写了如此巨大数量的代码,所以采取行动并改变系统的行为几乎是不现实的。更重要的是,至少从DBMS的第七个版本(1992-1996)开始,他们就开始谈论这个问题,现在第十二个版本即将到来。

NULL 和空字符串是等价的:

exec testBool( '' is null );  -- TRUE

如果你遵循经典的教诲,查看根源,那么空字符串与NULL的等价性的原因可以在varchar和NULL在数据块内的存储格式中找到。Oracle在一个由标题后跟数据列组成的结构中存储表行。每个列都由两个字段表示:列中的数据长度(1或3字节)和实际的数据本身。如果varchar2的长度为零,那么在数据字段中没有什么可写的,它不占用一个字节,长度字段中写入特殊值0xFF,表示没有数据。NULL以完全相同的方式表示:没有数据字段,长度字段中写入0xFF。Oracle的开发者当然可以区分这两个状态,但这就是它们从古代开始的方式。

对我个人来说,空字符串和NULL的等价性似乎相当自然和合乎逻辑。"空行"这个名字本身就意味着没有意义,空虚,甜甜圈洞。NULL基本上意味着同样的事情。但这里有一个不愉快的后果:对于空字符串,你可以肯定地说其长度等于零,但NULL的长度则根本没有定义。因此,length('')表达式将为您返回NULL,而不是您明显期望的零。另一个问题:您不能对空字符串进行比较。表达式val = ''会返回状态UNKNOWN,因为它实际上等同于val = NULL。

空字符串的长度是未定义的:

select length('') from dual; -- NULL

与空字符串的比较是不可能的:

exec test_bool( 'a' != '' ); -- UNKNOWN

Oracle的方法的批评者认为,空字符串并不一定意味着未知。例如,销售经理填写一张客户卡。他可能会注明他的联系电话(555-123456),可能会表示他的联系方式是未知的(NULL),或者可能会表示没有联系电话(空字符串)。使用Oracle存储空字符串的方法,实现后者选项将会是个问题。从语义的角度看,这个论点是正确的,但我总是对此有一个问题,我还没有得到一个完整的答案:经理如何在“电话”字段中输入一个空字符串,并且他将如何进一步区分它与NULL之间的差异?当然,有一些方法可以解决,但仍然存在疑问。

实际上,如果我们谈论PL/SQL,在其引擎的深处,空字符串与NULL是不同的。可以证明这一点的一个方法是,关联集合允许您在索引''(一个空字符串)处存储一个元素,但不允许您在索引NULL处存储一个元素。

declare  procedure empty_or_null( p_val varchar2 )   is    type tt is table of varchar2(1) index by varchar2(10);    t tt;  begin    if p_val is not null then      dbms_output.put_line('not null');    else      -- trying to create an element with index p_val      t(p_val) := 'x';      -- happened!      dbms_output.put_line('empty string');    end if;  exception    -- it was not possible to create an element with index p_val    when others then dbms_output.put_line('NULL');  end;begin empty_or_null( 'qwe' );  -- not null empty_or_null( '' );     -- empty string empty_or_null( NULL );   -- NULLend;

为了避免问题,最好从文档中学习这条规则:在Oracle中,空字符串和NULL是无法区分的。

NULL的数学计算 

select decode( null + 10,  null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWNselect decode( null * 10,  null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWNselect decode( abs(null),  null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWNselect decode( sign(null), null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWN

但与连接操作不同:你可以将NULL添加到一个字符串中,并且它不会改变它。这就是双重标准的策略。

select null ||'AA'|| null ||'BB'|| null from dual; -- AABB

NULL与聚合函数 几乎所有的聚合函数,除了COUNT(有时也不是),在计算过程中都会忽略null值。如果它们没有这样做,那么第一个遇到的NULL就会导致函数结果变为未知值。以SUM函数为例,它需要对序列(1,3,null,2)求和。如果考虑空值,我们将得到以下操作序列:

1 + 3 = 4;4 + null = null;null + 2 = null。

当计算聚合值时,你可能不会满意这样的计算,因为你可能并不希望得到这样的结果。

数据表格。下面多次使用:

create table agg( id int, n int );insert into agg values( 1, 1 );insert into agg values( 2, 3 );insert into agg values( 3, null );insert into agg values( 4, 2 );commit;

聚合函数忽略空值:

select sum(n) from agg; -- 6

COUNT行计数函数,如果使用为COUNT(*)或COUNT(constant),则会计算null值。但是,如果它被用作COUNT(expression),则null值将被忽略。

使用常量:

select count(*)    from agg; -- 4select count(1+1)  from agg; -- 4select count(user) from agg; -- 4

使用表达式:

select count(n)      from agg; -- 3select count(id)     from agg; -- 4select count(abs(n)) from agg; -- 3

此外,使用如AVG这样的函数时,应该小心。因为它会忽略null值,所以N字段的结果是(1+3+2)/3,而不是(1+3+2)/4。也许你不需要这样的平均值计算。为了解决这样的问题,有一个标准解决方案 - 使用NVL函数:

select avg(n)        from agg; -- (1 + 3 + 2) / 3 = 2select avg(nvl(n,0)) from agg; -- (1 + 3 + 0 + 2) / 4 = 1.5

如果聚合函数应用于一个空的数据集或者它只由NULLs组成,那么它们将返回UNKNOWN。例外是REGR_COUNT和COUNT(expression)函数,这些函数设计用于计算行数。在上述情况下,它们将返回零。

只有NULLs的数据集:

select sum(n)          from agg where n is null; -- UNKNOWNselect avg(n)          from agg where n is null; -- UNKNOWNselect regr_count(n,n) from agg where n is null; -- 0select count(n)        from agg where n is null; -- 0

空的数据集:

select sum(n)          from agg where 1 = 0; -- UNKNOWNselect avg(n)          from agg where 1 = 0; -- UNKNOWNselect regr_count(n,n) from agg where 1 = 0; -- 0select count(n)        from agg where 1 = 0; -- 0

在索引中的NULL 

当创建索引时,Oracle在索引结构中为包含NULL值的索引列的所有行包含条目。这样的记录被称为NULL记录。这使您能够快速识别相应列包含NULL的行,这在执行带有NULL或非NULL条件的查询时可能很有用。

  • 在常规索引中使用NULL值:常规索引包括对表行的引用,指示索引列的值和这些行的相应ROWIDs。对于具有NULL值的行,索引存储一个特殊的NULL标记,以指示索引列中存在NULL。这允许Oracle快速找到索引列中的NULL行。 

  • 在复合索引中使用NULL值:在索引多个列的复合索引中,每个列都有自己的索引结构。因此,对于包含NULL列的复合索引,每个包含NULL的列都会有一个NULL标记。 

  • 函数索引和NULLs:函数索引基于表列上的表达式或函数构建。如果函数允许NULL参数,则索引将包括NULL函数参数的条目。这在优化使用可为空函数的查询时可能很有用。 

不良做法 

  • 对低NULL基数的列进行索引:在大多数值为NULL的列上创建索引可能导致次优的索引使用和查询性能不佳。这是因为低NULL基数的索引会在数据库中占用大量空间,而带有这种索引的查询可能比全表扫描还要慢。 

  • 对具有NULL的非选择性列进行索引:非选择性列是具有少量唯一值或许多重复NULL值的列。在此类列上创建索引可能并不实用,因为此类索引可能无法显著提高查询性能,并且需要更多资源进行维护。 

  • 使用IS NOT NULL操作符与NULL索引:如果查询包含带有IS NOT NULL操作符的条件,则查询优化器不会使用NULL索引。因此,在这样的查询中使用NULL索引将是无用的,并浪费了创建和维护不必要索引的资源。 

  • 对可能包含NULL值的大文本列进行索引:在可能包含NULL值的大文本列上创建索引可能会有不利之处,因为必须在索引中存储大量数据。对此类列进行索引可能会显著增加索引的大小并降低查询性能。 

  • 过度使用带有NULL的函数索引:函数索引可用于优化允许null参数的函数的查询。但是,过度使用NULL函数索引可能导致不需要的索引大小和性能降级。 

  • 带有NULL的无关和未使用的索引:过时和未使用的NULL索引仍然保留在数据库中,消耗空间,并需要在数据更改时进行更新。应定期解析并删除这些索引,以减少系统负载并优化性能。 

重要的是要记住,使用NULL在索引中可以是有用的,但并不总是这样。在创建带有NULL的索引时,您应该注意列中NULL值的基数及其在查询中的实际使用情况。这将有助于避免不必要的索引并提高数据库性能。

良好做法 

  • 对高NULL基数的列进行索引:在高NULL基数的列上创建索引可能是有益的,因为索引允许您快速识别具有NULL值的行。当查询经常在某一列中使用null或非null条件时,这尤其有用。 

  • 对常用于查询的列进行索引:在经常用于查询的列上创建索引可以大大提高查询性能。索引可以帮助加速数据检索并减少查询执行时间。 

  • 使用带有NULL的函数索引:函数索引可用于优化允许null参数的函数的查询。此类索引可以提高使用带有NULL参数的函数的查询的性能。 

  • 与IS NULL结合使用带有NULL的索引:使用IS NULL操作符查找具有NULL值的行时,NULL索引可能非常有用。此类索引允许您快速找到对应列中的所有NULL行。 

使用NULL索引进行性能分析 

在创建带有NULL的索引时,建议您分析查询性能并将其与不带索引的性能进行比较。这

将帮助您确定哪些NULL索引实际上提高了查询性能,并在您的特定情况下是合理的。

  • 周期性索引维护:与普通索引一样,NULL索引需要周期性维护。定期更新索引统计信息将帮助查询优化器正确评估查询执行计划并避免不必要的操作。

  • 移除未使用的NULL索引:应定期解析并删除未使用的NULL索引,以减少系统负载并优化数据库性能。

  • 对更新和插入进行控制:使用NULL索引时,您需要控制更新和插入操作。NULL索引可能会影响这些操作的性能,因此在设计和优化查询时很重要要考虑到它们。

遵循这些良好实践将有效地在Oracle索引中使用NULL,提高查询性能并减少对数据库的影响。明智地使用NULL索引将帮助您充分利用索引并提高数据库效率。

作者:Andrei Rogalenko

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

相关文章:

深度分析Oracle中的NULL

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 关键点 特殊值NULL意味着没有数据&#xff0c;它声明了该值是未知的事实。默认情况下&#xff0c;任何类型的列和变量都可以取这个值&#xff0c;除非它们有一个NOT N…...

Python入门教学——类和对象

目录 一、面向过程和面向对象 1、面向过程 2、面向对象 二、类 三、类对象与类属性 1、类对象 2、类属性 四、类方法与静态方法 1、类方法 2、静态方法 一、面向过程和面向对象 1、面向过程 是一种以过程为中心的编程思想&#xff0c;强调事件的流程和顺序。思想&…...

【数据库系统概论】关系数据库中的关系数据结构

前言关系关系模式关系数据库关系模型的存储结构感谢 &#x1f496; 前言 上一篇文章【数据库系统概论】数据模型介绍了数据库系统中的数据模型的基本概念。其中提到了关系模型是最重要的一种数据模型。下面将介绍支持关系模型的数据库系统——关系数据库。 按照数据模型的三大…...

LabVIEW对Table中同一行数据分多次增加

LabVIEW对Table中同一行数据分多次增加 在对多个设备采集数据&#xff0c;同时需要记录到表格中。很多时候多台数据并不是同时更新&#xff0c;比如有的是在开关之前读取更新&#xff0c;有的则是在开关闭合后更新。只是用Number Indicator的方式&#xff0c;需要很多个&#…...

微信小程序实现删除功能

1. 前端 项目列表展示是使用的wx&#xff1a;for遍历 每个项目展示有3个模块 1. project-title 2. project-content 3. project-foot 全部代码如下 <t-sticky><view class"search"><t-search model:value"{{conditions.keyword}}" pl…...

整合Shiro+Jwt

整合ShiroJwt大体思路 springboot整合shiro大体上的思路&#xff1a; 1.自定义一个类Realm extends AuthorizingRealm{} 主要是对token授权和认证 重写2个方法 doGetAuthorizationInfo //授权 doGetAuthenticationInfo //认证 认证 代码中手动加上对token校验的判断2.自…...

Python 图形化界面基础篇:创建工具栏

Python 图形化界面基础篇&#xff1a;创建工具栏 引言 Tkinter 库简介步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建工具栏步骤4&#xff1a;向工具栏添加工具按钮步骤5&#xff1a;处理工具按钮的点击事件步骤6&#xff1a;启动…...

基于matlab实现的卡尔曼滤波匀加速直线运动仿真

完整程序&#xff1a; clear clc %% 初始化参数 delta_t 0.1; %采样时间 T 8; %总运行时长 t 0:delta_t:T; %时间序列 N length(t); %序列的长度 x0 0; %初始位置 u0 0; %初速度 U 10; %控制量、加速度 F [1 delta_t 0 1]; %状态转移矩阵 B …...

windows Visual Studio 2022 opengl开发环境配置

1. 安装glew(GL), GLFW, glm, soil2-debug 还需要premake生成visual studio solution cmake for windows也要安装一个&#xff0c; 但是不用安装MinGW64, bug多 下载源码&#xff0c;找到xxx.sln文件用visual stidio打开solution编译代码&#xff0c;找到xxx.lib, xxx.dll文件…...

中国财政科学研究院党委书记、院长刘尚希一行莅临麒麟信安调研

为贯彻落实省委第十二届四次全会精神&#xff0c;加快推动湖南高质量发展&#xff0c;9月16日下午&#xff0c;由中国财政科学研究院党委书记、院长刘尚希&#xff0c;中国电子信息产业发展研究院总工程师秦海林&#xff0c;省委改革办副主任梁仲&#xff0c;省发展改革委党组成…...

基于element-ui的年份范围选择器

基于element-ui的年份范围选择器 element-ui官方只有日期范围和月份范围选择器&#xff0c;根据需求场景需要&#xff0c;支持年份选择器&#xff0c;原本使用两个分开的年份选择器实现的&#xff0c;但是往往有些是不能接受的。在网上找了很多都没有合适的&#xff0c;所以打…...

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…...

JS操作数组方法学习系列(1)

目录 数组添加元素 (push)数组移除末尾元素 (pop)数组添加元素到开头 (unshift)数组移除开头元素 (shift)数组查找元素索引 (indexOf)数组反向查找元素索引 (lastIndexOf)数组切割 (slice)数组连接 (concat)数组元素查找 (find 和 findIndex)数组元素过滤 (filter)数组元素映射…...

翻牌闯关游戏

翻牌闯关游戏 3关&#xff1a;关卡由少至多12格、20格、30格图案&#xff1a;12个玩法&#xff1a;点击两张卡牌&#xff0c;图案一到即可消除掉 记忆时长(毫秒)&#xff1a;memoryDurationTime:5000 可配置&#xff1a;默认5000 提示游戏玩法&#xff1a;showTipsFlag:1 可…...

CilckHouse创建表

一、引擎 一开始没注意有引擎选择&#xff0c;要用什么引擎去官方文档看看自己建的表适合什么引擎&#xff0c;大部分用MergeTree 二、用sql语句生成表 1、MergeTree引擎 原文地址&#xff1a;https://blog.csdn.net/qq_21383435/article/details/122812921?ops_request_misc%…...

高级运维学习(八)Ceph 概述与部署

ceph概述 ceph可以实现的存储方式&#xff1a; 块存储&#xff1a;提供像普通硬盘一样的存储&#xff0c;为使用者提供“硬盘”文件系统存储&#xff1a;类似于NFS的共享方式&#xff0c;为使用者提供共享文件夹对象存储&#xff1a;像百度云盘一样&#xff0c;需要使用单独的客…...

【图像处理】VS编译opencv源码,并调用编译生成的库

背景 有些时候我们需要修改opencv相关源码&#xff0c; 这里介绍怎么编译修改并调用修改后的库文件。 步骤 1、下载相关源码工具&#xff1a; 下载opencv4.8源码并解压 https://down.chinaz.com/soft/40730.htm 下载VS2019&#xff0c;社区版免费 https://visualstudio.micro…...

STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案

第 1 章 概述  技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出&#xff08;RJ45 接口&#xff09;&#xff0c;支持多组动态 PDO 分组和对象字典的自动映射&#xff0c;支持站 号 ID 的自动设置与保存&#xff0c;支持 SDO 的…...

Postman应用——测试脚本Test Script

文章目录 Test Script脚本CollectionFolderRequest 解析响应体断言测试 测试脚本可以在Collection、Folder和Request的Pre-request script 和 Test script中编写&#xff0c;测试脚本可以检测请求响应的各个方面&#xff0c;包括正文、状态代码、头、cookie、响应时间等&#x…...

JS的网络状态以及强网弱网详解

文章目录 1. online 和 offline 事件2. navigator.onLine2.1 什么是 navigator.connection&#xff1f;2.2 如何使用 navigator.connection&#xff1f;2.3 总结 1. online 和 offline 事件 online 和 offline 事件是浏览器自带的两个事件&#xff0c;可以通过添加事件监听器来…...

大数据-kafka学习笔记

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输…...

详述RPA项目管理流程,RPA项目管理流程是什么?

RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;是一种通过软件机器人模拟人类在计算机上执行重复性任务的技术。RPA可以帮助企业提高工作效率、降低成本、减少错误并提高客户满意度。然而&#xff0c;为了确保RPA项目的成功实施&#xff…...

爬虫 — Js 逆向

目录 一、概念1、爬虫2、反爬虫3、加密解密4、加密5、步骤 二、常用加密方式1、加密方式2、常见加密算法3、JS 中常见的算法4、MD5 算法4.1、MD5 加密网站4.2、特点 5、DES/AES 算法6、RSA 算法7、base64 算法 三、环境配置1、node.js 环境配置2、PyCharm 环境配置 一、概念 1…...

Python 网络爬取的时候使用那种框架

尽管现代的网站多采取前后端分离的方式进行开发了&#xff0c;但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。 因此&#xff0c;在一些特定的网站上&#xff0c;我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构&#xff0c;甚至是处理…...

CentOS7安装源设置

此处的安装源地址需要填写&#xff1a;&#xff08;适用于centos7&#xff09; http://mirrors.aliyun.com/centos/7/os/x86_64/...

pool = multiprocessing.Pool()报错:module object has no attribute Pool

pool multiprocessing.Pool()报错&#xff1a;module object has no attribute Pool&#xff0c;为什么&#xff1f; 我很抱歉&#xff0c;前面提供的回答是错误的。在Python的multiprocessing模块中&#xff0c;确实有一个名为Pool的类。如果你在使用multiprocessing.Pool()…...

Linux Shell 实现一键部署podman

podman 介绍 使用 Podman 管理容器、Pod 和映像。从本地环境中无缝使用容器和 Kubernetes&#xff0c;Podman 提供与 Docker 非常相似的功能&#xff0c;它不需要在你的系统上运行任何守护进程&#xff0c;并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行…...

Biome-BGC生态系统模型与Python融合技术

Biome-BGC是利用站点描述数据、气象数据和植被生理生态参数&#xff0c;模拟日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空间尺度可以从点尺度扩展到陆地生态系统。 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算出每天…...

Matlab图像处理-区域描述

一旦一幅图像的目标区域被确定&#xff0c;我们往往用一套描述子来表示其特性。选择区域描述子的动机不单纯为了减少在区域中原始数据的数量&#xff0c;而且也应有利于区别带有不同特性的区域。因此&#xff0c;当目标区域有大小、旋转、平移等方面的变化时&#xff0c;针对这…...

openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据

文章目录 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据 修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新…...

河南住房与城乡建设厅网站/深圳优化公司

SSH之所以能够保证安全&#xff0c;原因在于它采用了公钥加密。 整个ssh密码登录过程是这样的&#xff1a; 1&#xff09;客户机向服务器发登录请求&#xff1a;ssh user远程服务器 后面远程服务器简称服务器 2&#xff09;服务器收到客户机的登录请求&#xff0c;把自己的公…...

苏州前几天网站建设/seo代码优化步骤

最近在做压力测试&#xff0c;用户数不到60&#xff0c;就没有办法响应&#xff0c;用了下面的优化流程并发性能提高了很多 环境centos5.7 tomcat6 http://apr.apache.org/download.cgi 1、修改tomcat让其支持NIO 编辑Tomcat目录下面的conf子目录下面的server.xml文件 vi …...

农业公司怎样建立网站/平台推广是做什么的

一. 概念 依据Galois理论,从大量的&#xff08;实验&#xff09;数据&#xff08;测试例&#xff09;中挑选适量的,有代表性的点&#xff08;例&#xff09;,从而合理地安排实验&#xff08;测试&#xff09;的一种科学实验设计方法.类似的方法有:聚类分析方法,因子方法方法等…...

做花酒的网站/广告推广计划

摘要&#xff1a;大数据时代已经到来。现阶段&#xff0c;我国大数据产业发展如何&#xff1f;大数据应用领域在哪&#xff1f;大数据价值在哪里&#xff1f;带着这些疑问&#xff0c;走进大数据&#xff0c;感受大数据带来的神奇魔力。关注作者&#xff1a;需要大数据学习视频…...

wordpress搜索功能加强/直播回放老卡怎么回事

PHP文章摘要生成方法(函数)文章生成摘要的方法有多种&#xff0c;可以用JS在客户端生成&#xff0c;也可以在服务器端生成&#xff0c;当然更不排除在数据库中加一个摘要字段&#xff0c;在发布文章的时候自行设置。以下是在服务器端生成时的方法。我们在写BLOG时经常需要显示文…...

网站建设的技巧有哪些方面/武汉seo托管公司

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…...