深度分析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 ) is
begin
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 ); -- UNKNOWN
exec testBool( null != null ); -- UNKNOWN
exec testBool( null = 'a' ); -- UNKNOWN
exec 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; -- YES
select 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; -- YES
select 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) ); -- UNKNOWN
exec testBool( not(null != null) ); -- UNKNOWN
exec testBool( not(null = 'a') ); -- UNKNOWN
exec testBool( not(null != 'a') ); -- UNKNOWN
或运算符:
exec testBool( null or true ); -- TRUE <- !!!!!
exec testBool( null or false ); -- UNKNOWN
exec testBool( null or null ); -- UNKNOWN
与运算符:
exec testBool( null and true ); -- UNKNOWN
exec 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 ); -- NULL
end;
为了避免问题,最好从文档中学习这条规则:在Oracle中,空字符串和NULL是无法区分的。
NULL的数学计算
select decode( null + 10, null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWN
select decode( null * 10, null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWN
select decode( abs(null), null, 'UNKNOWN', 'KNOWN') a from dual; -- UNKNOWN
select 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; -- 4
select count(1+1) from agg; -- 4
select count(user) from agg; -- 4
使用表达式:
select count(n) from agg; -- 3
select count(id) from agg; -- 4
select 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 = 2
select 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; -- UNKNOWN
select avg(n) from agg where n is null; -- UNKNOWN
select regr_count(n,n) from agg where n is null; -- 0
select count(n) from agg where n is null; -- 0
空的数据集:
select sum(n) from agg where 1 = 0; -- UNKNOWN
select avg(n) from agg where 1 = 0; -- UNKNOWN
select regr_count(n,n) from agg where 1 = 0; -- 0
select 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,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 关键点 特殊值NULL意味着没有数据,它声明了该值是未知的事实。默认情况下,任何类型的列和变量都可以取这个值,除非它们有一个NOT N…...

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

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

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

微信小程序实现删除功能
1. 前端 项目列表展示是使用的wx: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大体上的思路: 1.自定义一个类Realm extends AuthorizingRealm{} 主要是对token授权和认证 重写2个方法 doGetAuthorizationInfo //授权 doGetAuthenticationInfo //认证 认证 代码中手动加上对token校验的判断2.自…...

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

基于matlab实现的卡尔曼滤波匀加速直线运动仿真
完整程序: 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也要安装一个, 但是不用安装MinGW64, bug多 下载源码,找到xxx.sln文件用visual stidio打开solution编译代码,找到xxx.lib, xxx.dll文件…...

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

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

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。
您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。详情查看:http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的,点击以后就进入…...
JS操作数组方法学习系列(1)
目录 数组添加元素 (push)数组移除末尾元素 (pop)数组添加元素到开头 (unshift)数组移除开头元素 (shift)数组查找元素索引 (indexOf)数组反向查找元素索引 (lastIndexOf)数组切割 (slice)数组连接 (concat)数组元素查找 (find 和 findIndex)数组元素过滤 (filter)数组元素映射…...

翻牌闯关游戏
翻牌闯关游戏 3关:关卡由少至多12格、20格、30格图案:12个玩法:点击两张卡牌,图案一到即可消除掉 记忆时长(毫秒):memoryDurationTime:5000 可配置:默认5000 提示游戏玩法:showTipsFlag:1 可…...
CilckHouse创建表
一、引擎 一开始没注意有引擎选择,要用什么引擎去官方文档看看自己建的表适合什么引擎,大部分用MergeTree 二、用sql语句生成表 1、MergeTree引擎 原文地址:https://blog.csdn.net/qq_21383435/article/details/122812921?ops_request_misc%…...
高级运维学习(八)Ceph 概述与部署
ceph概述 ceph可以实现的存储方式: 块存储:提供像普通硬盘一样的存储,为使用者提供“硬盘”文件系统存储:类似于NFS的共享方式,为使用者提供共享文件夹对象存储:像百度云盘一样,需要使用单独的客…...

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

STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案
第 1 章 概述 技术特点 支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出(RJ45 接口),支持多组动态 PDO 分组和对象字典的自动映射,支持站 号 ID 的自动设置与保存,支持 SDO 的…...

Postman应用——测试脚本Test Script
文章目录 Test Script脚本CollectionFolderRequest 解析响应体断言测试 测试脚本可以在Collection、Folder和Request的Pre-request script 和 Test script中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等&#x…...
JS的网络状态以及强网弱网详解
文章目录 1. online 和 offline 事件2. navigator.onLine2.1 什么是 navigator.connection?2.2 如何使用 navigator.connection?2.3 总结 1. online 和 offline 事件 online 和 offline 事件是浏览器自带的两个事件,可以通过添加事件监听器来…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...