问题小记-达梦数据库报错“字符串转换出错”处理
最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题,这个问题主要是涉及到一条sql语句的执行,在此分享下这个报错的处理过程。
问题表现为:一样的表结构和数据,执行相同的SQL,在Oracle数据库中执行正常,到达梦数据库执行报错。
SQL语句大致如下:
SELECT "START_VAL", "END_VAL"
FROM
(SELECT FLOOR(C2 / 200000) * 200000 AS START_VAL, CEIL(C2 / 200000) * 200000 - 1 AS END_VALFROM T1WHERE C3 IN ('测试1', '测试2')GROUP BY FLOOR(C2 / 200000) * 200000, CEIL(C2 / 200000) * 200000 - 1
)
WHERE START_VAL < END_VAL;
还有一个现象, 如果把最后的条件“WHERE START_VAL < END_VAL”去掉,SQL就可以正常执行,结果如下图。
客户尝试过对SQL语句中C2列使用to_number和CAST函数做显示类型转换,仍然会报错。这里不做赘述。
其实既然涉及到字符串转换出错,那问题的表象就很明显了,一定是查询语句中对应列字段真的涉及到字符串转换才会出错,数据库不会凭空报错的。
这里根据当时最终排查的结果,人工构造一批测试数据来复现下当时的情况,然后看下当时的分析过程:
--创建表
DROP TABLE IF EXISTS T1;
CREATE TABLE T1(C1 INT, C2 VARCHAR2(20), C3 VARCHAR2(50), C4 VARCHAR2(50),NOT CLUSTER PRIMARY KEY(C1));
--创建索引
CREATE INDEX IDX1 ON T1(C1 ASC,C3 ASC,C2 ASC);
--插入测试数据
DECLARE
BEGINFOR I IN 1..1000 LOOPIF (I >= 1 AND I <= 200) THENIF MOD(I, 3) = 0 THENINSERT INTO T1 VALUES(I, DBMS_RANDOM.STRING('X', 10), DBMS_RANDOM.STRING('X', 10), DBMS_RANDOM.STRING('X', 10));ELSEINSERT INTO T1 VALUES(I, ABS(FLOOR(DBMS_RANDOM.VALUE(1000000000, 9999999999))), '测试1', DBMS_RANDOM.STRING('X', 10));END IF;ELSEIF I IN (119,120,911,10086,12345,12315,12580,96577) THENINSERT INTO T1 VALUES(I, DBMS_RANDOM.STRING('X', 10), DBMS_RANDOM.STRING('X', 10), DBMS_RANDOM.STRING('X', 10));ELSEINSERT INTO T1 VALUES(I, ABS(FLOOR(DBMS_RANDOM.VALUE(1000000000, 9999999999))), '测试2', DBMS_RANDOM.STRING('X', 10));END IF;END IF;END LOOP;COMMIT;
END;
SELECT COUNT(*) FROM T1; --共计1000条数据
注意:这里的表结构中只是本次模拟表结构随意创建的C1字段主键,实际业务场景中表字段很多,C1列也并不是主键,且表T1中包含C2和C3列的索引不止一条。表实际数据有几千万条,这里只做大致的问题模拟。
出现问题的SQL语句很简单,且只涉及到一张表,查询语句只涉及到T1表的两个字段列,分别为C2、C3,在SQL中能涉及到类型转换报错的,可以大胆判断是FLOOR和CEIL函数处理数据出现的问题。FLOOR和CEIL函数的功能如下:
这两个函数中的参数应该为数值类型才可以正常执行不报错
此时查看T1表结构,很明显,查询列C2是varchar2类型,SQL查询过程中会存在数据类型隐式转换。
通过几条SQL,来查看下数据,看看C2列数据是什么样的
先大致查询下全表数据
SELECT * FROM T1; --查看全表数据
从上图可以得知,C2列是存在非纯数值类型的字符串的
根据过滤条件,查询下数据
SELECT * FROM T1 WHERE C3 IN ('测试1', '测试2'); --根据条件查看全表数据
根据查询结果来看,应该都是纯数字。再次查询下条数
SELECT COUNT(*) FROM T1 WHERE C3 IN ('测试1', '测试2'); --933
一共有933行
验证下C2列是否全为数值类型
SELECT COUNT(*) FROM T1 WHERE C3 IN ('测试1', '测试2') AND ISNUMERIC((C2)); --933
确认根据条件过滤后,都是数值类型,这时候使用FLOOR和CEIL理论上来说,并不应该出问题。
此时可以推测,是查询到了过滤条件“('测试1', '测试2')”之外的C2列数据,这种情况下使用FLOOR和CEIL函数一定会出现报错。如果是这种情况,就不得不看下达梦的SQL执行计划了,大概率是没有对条件提前进行过滤。执行计划如下:
1 #NSET2: [2, 1, 144]
2 #PRJT2: [2, 1, 144]; exp_num(2), is_atom(FALSE)
3 #PRJT2: [2, 1, 144]; exp_num(2), is_atom(FALSE)
4 #HAGR2: [2, 1, 144]; grp_num(2), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889195957.TMPCOL0, DMTEMPVIEW_889195957.TMPCOL1)
5 #PRJT2: [1, 2, 144]; exp_num(2), is_atom(FALSE)
6 #HASH RIGHT SEMI JOIN2: [1, 2, 144]; n_keys(1) KEY(DMTEMPVIEW_889195959.colname=T1.C3) KEY_NULL_EQU(0)
7 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
8 #SLCT2: [1, 50, 96]; exp11*var5 < exp11*var5-var6
9 #SSCN: [1, 50, 96]; IDX1(T1); btr_scan(1); is_global(0)
分析以上的执行计划,执行顺序大致如下:
1、SQL执行过程中,先走了索引IDX1,直接对这个二级索引IDX进行扫描,
2、通过FLOOR和CEIL两个函数计算相关结果,并根据最外层条件带入进行过滤。
3、CONST VALUE LIST常量列表放的是查询条件C3的两个参数值'测试1'和'测试2'
4、将常量列表与第2步中过滤后的结果做HASH RIGHT SEMI JOIN
5、PRJT2获取第4步的join结果
6、HASH分组,并计算集函数
7、PRJT2获取第6步分组后的结果,至此最内层子查询已结束
8、PRJT2最外层查询结果
9、结果集输出
计划中涉及到的索引定义如下:
CREATE INDEX IDX1 ON T1(C1 ASC,C3 ASC,C2 ASC);
该索引包含了查询列和where条件列。
根据执行计划和索引定义,其实问题已经很明显了。情况和预料的一样,条件列C3的值并没有提前过滤,IDX的SSCN是包含那些不是纯数值类型的字符串的,此时用函数FLOOR和CEIL来处理数据就会报错。
那么为什么去掉最外层的where子句后,查询正常呢。让我们看下去掉“WHERE START_VAL < END_VAL”之后的执行计划
1 #NSET2: [2, 1, 144]
2 #PRJT2: [2, 1, 144]; exp_num(2), is_atom(FALSE)
3 #PRJT2: [2, 1, 144]; exp_num(2), is_atom(FALSE)
4 #HAGR2: [2, 1, 144]; grp_num(2), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889195968.TMPCOL0, DMTEMPVIEW_889195968.TMPCOL1)
5 #PRJT2: [1, 50, 144]; exp_num(2), is_atom(FALSE)
6 #HASH RIGHT SEMI JOIN2: [1, 50, 144]; n_keys(1) KEY(DMTEMPVIEW_889195970.colname=T1.C3) KEY_NULL_EQU(0)
7 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
8 #SSCN: [1, 1000, 96]; IDX1(T1); btr_scan(1); is_global(0)
上边的计划,可以看到,虽然也走了索引IDX1,也是SSCN对这个二级索引IDX进行扫描,但是这里SSCN后,直接与CONST VALUE LIST常量列表做了HASH RIGHT SEMI JOIN,此时已经不存在非数值的字符串了,之后再做函数计算时就不会报错。
那么这条原始SQL,在Oracle中的执行计划是什么样的呢?Oracle的计划如下:
Plan Hash Value : 4058097160 -------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 47 | 940 | 4 | 00:00:01 |
| 1 | HASH GROUP BY | | 47 | 940 | 4 | 00:00:01 |
| * 2 | INDEX FAST FULL SCAN | IDX1 | 47 | 940 | 3 | 00:00:01 |
-------------------------------------------------------------------------Predicate Information (identified by operation id):
------------------------------------------
* 2 - filter(("C3"='测试1' OR "C3"='测试2') AND FLOOR(TO_NUMBER("C2")/200000)*200000<CEIL(TO_NUMBER("C2")/200000)*200000-1)
上边Oracle的执行计划,可以看出来,Oracle在IDX SCAN的时候,做了C3条件过滤,然后做了FLOOR和CEIL函数处理,所以Oracle执行没有问题。
根据对达梦SQL分析的情况,如果能够正常先根据C3过滤数据,再做FLOOR和CEIL就不会报错。
依照这种思路处理的方法其实有很多,比如
方法一:再创建一个C3和C2列的索引
create index idx2 on T1(C3 ASC,C2 ASC);
执行计划如下:
1 #NSET2: [1, 1, 96]
2 #PRJT2: [1, 1, 96]; exp_num(2), is_atom(FALSE)
3 #PRJT2: [1, 1, 96]; exp_num(2), is_atom(FALSE)
4 #HAGR2: [1, 1, 96]; grp_num(2), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889196107.TMPCOL0, DMTEMPVIEW_889196107.TMPCOL1)
5 #PRJT2: [1, 50, 96]; exp_num(2), is_atom(FALSE)
6 #NEST LOOP INDEX JOIN2: [1, 50, 96]
7 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
8 #SLCT2: [1, 25, 96]; exp11*var5 < exp11*var5-var6
9 #SSEK2: [1, 25, 96]; scan_type(ASC), IDX2(T1), scan_range[(DMTEMPVIEW_889196109.colname,min),(DMTEMPVIEW_889196109.colname,max)), is_global(0)
此时的计划中可以看到是SSEK2二级索引数据定位,是能够直接过滤掉C3列数据的,之后再做函数FLOOR和CEIL不会报错。SQL语句也能正常执行。
方法二:以上创建的索引,似乎有冗余之嫌,因为已存在的IDX1已包含了C2和C3列,如果能调整IDX1索引列顺序,不增加索引的情况下会更好,但这就需要根据实际业务需求判断是否可以如此操作了。
CREATE OR REPLACE INDEX IDX1 ON T1(C3 ASC,C2 ASC,C1 ASC);
执行计划如下:
1 #NSET2: [1, 1, 96]
2 #PRJT2: [1, 1, 96]; exp_num(2), is_atom(FALSE)
3 #PRJT2: [1, 1, 96]; exp_num(2), is_atom(FALSE)
4 #HAGR2: [1, 1, 96]; grp_num(2), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889196261.TMPCOL0, DMTEMPVIEW_889196261.TMPCOL1)
5 #PRJT2: [1, 50, 96]; exp_num(2), is_atom(FALSE)
6 #NEST LOOP INDEX JOIN2: [1, 50, 96]
7 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
8 #SLCT2: [1, 25, 96]; exp11*var5 < exp11*var5-var6
9 #SSEK2: [1, 25, 96]; scan_type(ASC), IDX1(T1), scan_range[(DMTEMPVIEW_889196263.colname,min,min),(DMTEMPVIEW_889196263.colname,max,max)), is_global(0)
此时的执行计划可以看到与方法一是相同的,问题同样得到解决。
方法三:改写SQL语句,这种方式不会额外创建索引,也不会改变原有索引的字段顺序,如果业务方便进行SQL改造,也是一种不错的解决办法,下边提供两种改写方法:
(1)通过使用窗口函数来避免 GROUP BY 子句的改写方法
SELECT START_VAL, END_VAL
FROM
(SELECTFLOOR(C2 / 200000) * 200000 AS START_VAL,CEIL(C2 / 200000) * 200000 - 1 AS END_VAL,ROW_NUMBER() OVER (PARTITION BY FLOOR(C2 / 200000) * 200000 ORDER BY C2) AS RNFROM T1WHERE C3 IN ('测试1','测试2')
) AS SUBQUERY
WHERE RN = 1 AND START_VAL < END_VAL;
执行计划如下:
1 #NSET2: [1, 2, 156]
2 #PRJT2: [1, 2, 156]; exp_num(3), is_atom(FALSE)
3 #SLCT2: [1, 2, 156]; (SUBQUERY.RN = var2 AND SUBQUERY.START_VAL < SUBQUERY.END_VAL)
4 #PRJT2: [1, 50, 156]; exp_num(4), is_atom(FALSE)
5 #AFUN: [1, 50, 156]; afun_num(1); partition_num(1)[DMTEMPVIEW_889196575.TMPCOL1]; order_num(1)[DMTEMPVIEW_889196575.TMPCOL0]
6 #SORT3: [1, 50, 156]; key_num(2), partition_key_num(0), is_distinct(FALSE), top_flag(0), is_adaptive(0)
7 #PRJT2: [1, 50, 156]; exp_num(3), is_atom(FALSE)
8 #HASH2 INNER JOIN: [1, 50, 156]; KEY_NUM(1); KEY(DMTEMPVIEW_889196577.colname=T1.C3) KEY_NULL_EQU(0)
9 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
10 #SSCN: [1, 1000, 108]; IDX1(T1); btr_scan(1); is_global(0)
上边的计划,与前文所述的去掉最外层where子句“START_VAL < END_VAL”条件类似。先做SSCN,再与CONST VALUE LIST关联过滤掉C3列的数据,不会出现“字符串类型转换出错”的异常。
(2)把SQL修改为inner join的方式
SELECT A.START_VAL, B.END_VAL
FROM(SELECTFLOOR(C2 / 200000) * 200000 AS START_VALFROMT1WHERE C3 IN ('测试1','测试2')GROUP BY FLOOR(C2 / 200000) * 200000) AS A
INNER JOIN(SELECTCEIL(C2 / 200000) * 200000 - 1 AS END_VALFROMT1WHERE C3 IN ('测试1','测试2')GROUP BY CEIL(C2 / 200000) * 200000 - 1) AS B
ON A.START_VAL < B.END_VAL;
执行计划如下:
1 #NSET2: [68, 1, 288]
2 #PRJT2: [68, 1, 288]; exp_num(2), is_atom(FALSE)
3 #SLCT2: [68, 1, 288]; A.START_VAL < B.END_VAL
4 #NEST LOOP INNER JOIN2: [68, 1, 288]
5 #PRJT2: [2, 1, 144]; exp_num(1), is_atom(FALSE)
6 #HAGR2: [2, 1, 144]; grp_num(1), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889196622.TMPCOL0)
7 #PRJT2: [1, 50, 144]; exp_num(1), is_atom(FALSE)
8 #HASH RIGHT SEMI JOIN2: [1, 50, 144]; n_keys(1) KEY(DMTEMPVIEW_889196625.colname=T1.C3) KEY_NULL_EQU(0)
9 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
10 #SSCN: [1, 1000, 96]; IDX1(T1); btr_scan(1); is_global(0)
11 #PRJT2: [2, 1, 144]; exp_num(1), is_atom(FALSE)
12 #HAGR2: [2, 1, 144]; grp_num(1), sfun_num(0); slave_empty(0) keys(DMTEMPVIEW_889196623.TMPCOL0)
13 #PRJT2: [1, 50, 144]; exp_num(1), is_atom(FALSE)
14 #HASH RIGHT SEMI JOIN2: [1, 50, 144]; n_keys(1) KEY(DMTEMPVIEW_889196626.colname=T1.C3) KEY_NULL_EQU(0)
15 #CONST VALUE LIST: [1, 2, 48]; row_num(2), col_num(1)
16 #SSCN: [1, 1000, 96]; IDX1(T1); btr_scan(1); is_global(0)
上边的计划,与第一种改写方法类似。同样是先做SSCN,再与CONST VALUE LIST关联过滤掉C3列的数据,不会出现“字符串类型转换出错”的异常。这种方法是将START_VAL和END_VAL分别拆分为两张A、B表的字段,A表和B表进行inner join。当数据量很大时,执行计划就显得不那么好看了,预估代价会非常大,但还是以最终实际执行效率为准。
最终方案:由于客户SQL可改写,最终采取了改写的方案,尽量避免了改动原表的索引。但采取的是第二种方案inner join方式。本文开头构造表数据时曾提到,客户数据量很大,两个改写的SQL第二种inner join方式的执行计划预估代价非常高,但实际执行效率是最优的,比第一种改写方案快几倍。如果在第二种改写的SQL基础上加上并行hint,效率会更高。(注:第一种改写方式的SQL加并行hint执行效率基本不变)
因此最终确定SQL改写大致如下:
SELECT /*+PARALLEL(4)*/ A.START_VAL, B.END_VAL
FROM(SELECTFLOOR(C2 / 200000) * 200000 AS START_VALFROMT1WHERE C3 IN ('测试1','测试2')GROUP BY FLOOR(C2 / 200000) * 200000) AS A
INNER JOIN(SELECTCEIL(C2 / 200000) * 200000 - 1 AS END_VALFROMT1WHERE C3 IN ('测试1','测试2')GROUP BY CEIL(C2 / 200000) * 200000 - 1) AS B
ON A.START_VAL < B.END_VAL;
总结:
1、在处理问题的过程中,思维要灵活,分析要细致,定位问题原因很重要。问题排错处理不能盲目进行,““东一榔头,西一棒子”的方式不可取,直击要害,循序渐进,才是解决问题之本。
2、达梦数据库使用过程中,数据库的优化器有待进一步改进,在实际使用过程中,需要不断人工调试,才能使业务系统保持在较好的运行状态。
相关文章:

问题小记-达梦数据库报错“字符串转换出错”处理
最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题,这个问题主要是涉及到一条sql语句的执行,在此分享下这个报错的处理过程。 问题表现为:一样的表结构和数据,执行相同的SQL,在Oracle数据库中执行正常&…...
MyBatis入门的详细应用实例
目录 MyBatis第一章:代理Dao方式的CRUD操作1. 代理Dao方式的增删改查 第二章:MyBatis参数详解1. parameterType2. resultType 第三章:SqlMapConfig.xml配置文件1. 定义properties标签的方式管理数据库的信息2. 类型别名定义 MyBatis 第一章&…...
Sequelize ORM sql 语句工具
Sequelize ORM sql 语句工具 初始化配置 Sequelize orm 配置文章落日沉溺于海 在命令行中全局安装 npm i -g sequelize-clisequelize 执行需要匹配 mysql2 对应的依赖(安装 mysql2) npm i sequelize mysql2初始化项目 sequelize init熟悉初始化项目后…...

增强LabVIEW与PLC通信稳定性
在工业自动化系统中,上位机与PLC之间的通信稳定性至关重要,尤其是在数据采集和控制任务的实时性要求较高的场景中。LabVIEW作为常用的上位机开发平台,通过合理优化通信协议、硬件接口、数据传输方式以及系统容错机制,可以大大提升…...
UDP系统控制器_音量控制、电脑关机、文件打开、PPT演示、任务栏自动隐藏
UDP系统控制器(ShuiYX) 帮助文档 概述 本程序设计用于通过UDP协议接收指令来远程控制计算机的音量、执行特定命令和其他功能。为了确保程序正常工作,请确认防火墙和网络设置允许UDP通信,并且程序启动后会最小化到托盘图标。 命令格式及说明 音量控制…...

NK细胞杀伐功能如何实现?
在人体的免疫系统中,自然杀伐细胞(Natural Killer Cells,简称NK细胞)是一类完全自然的免疫激活力量。它们为人体提供了快速反应能力,不依赖类元的特定识别力,但能直接寻找和毁灭毒病感染细胞和肿瘤细胞。那…...

Ubuntu搭建ES8集群+加密通讯+https访问
目录 写在前面 一、前期准备 1. 创建用户和用户组 2. 修改limits.conf文件 3. 关闭操作系统swap功能 4. 调整mmap上限 二、安装ES 1.下载ES 2.配置集群间安全访问证书密钥 3.配置elasticsearch.yml 4.修改jvm.options 5.启动ES服务 6.修改密码 7.启用外部ht…...

PC寄存器(Program Counter Register)jvm
在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色。以下是对JVM中PC寄存器的详细解释: 一、定义与功能 定义: JVM中的PC寄存器,也被称为程序计数器,是对物理PC寄存器的一种抽象模拟。它用于存储当前线程所执行的字节码指令的地址,即指…...
预览和下载 (pc和微信小程序)
1.微信小程序 预览pdf 或者 图片等 //utils.js 文件//通过接口返回文件链接 打开文档 export default function previewFile({ downLinkUrl, tempFilePath }) {let url "https://" downLinkUrl.replace("http://", "").replace("https:…...

使用 DeepSpeed 微调 OPT 基础语言模型
文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…...
BSM和BMS什么区别?
BSM BSM(Battery System Manager)是指用于管理和控制电动车辆的电池系统的设备,其功能包括监测电池状态、控制充放电过程、保护电池安全等。 BMS BMS(Battery Management System)是指用于监测、控制和保护电池组的设…...

使用Maven打包javaagent.jar
1、简介 javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码。 java1.5 之前使用的是JVMTI(jvm tool interface)技术来实现对class的拦截,不过这个是用 C 编写的&#…...

R语言混合模型回归GBTM群组轨迹模型绘图可视化研究
全文链接:https://tecdat.cn/?p38581 在回归分析的广袤领域中,面对具有多条未知函数线的复杂数据时,传统方法常常捉襟见肘。混合模型作为一种强有力的分析手段应运而生,其在处理此类复杂情境时展现出独特的优势与潜力(…...

【毕业设计】A079-基于Java的影院订票系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…...
Vue.js前端框架教程11:Vue监听器watch和watchEffect
文章目录 监听器(watchers)基本用法deep: trueimmediate: true总结 watchEffect基本用法自动追踪依赖停止监听与 watch 的对比性能优化总结 监听器(watchers) 在 Vue 中,监听器(watchers)是一种…...

疾风大模型气象系统:精准预报,引领未来
精准预报,引领未来 在当今快速变化的世界中,天气预报已成为日常生活和社会运行中不可或缺的一部分。从规划日常出行到防范极端天气影响,高精准的气象服务正在重新定义我们的生活方式。而在这一领域,疾风大模型气象系统以其卓越的技术实力和领先的预测能力,正引领气象服务…...

U9应收单拉单生成时找不到退货单
财务说做应收单时抓不到一张退货单。2022年单据。这样的单据让人联想翩翩,胡思乱想。怎么复杂怎么想,钻了牛角尖。分析了1天也没有结果。不知道系统的逻辑,只能用猜想的形式去分析。 问过顾问之后,原来是单据类型错了。从而知道了…...

设计模式--单例模式【创建型模式】
设计模式的分类 我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类: 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。结构型模式(7 种)࿱…...
挑战一个月基本掌握C++(第七天)了解指针,引用,时间,输入输出,结构体,vector容器,数据结构 - 通用完结
一 指针 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。 下面的实例,它将输出定义的变量地址: #include <iostream>using…...

百度面试手撕 go context channel部分学习
题目 手撕 对无序的切片查询指定数 使用context进行子协程的销毁 并且进行超时处理。 全局变量定义 var (startLoc int64(0) // --- 未处理切片数据起始位置endLoc int64(0) // --- 切片数据右边界 避免越界offset int64(0) // --- 根据切片和协程数量 在主线程 动态设…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...