Oracle迁移人大金仓V8实战:SQL改写、函数适配与性能调优指南
1. 项目概述从Oracle到人大金仓的迁移实战最近两年因为工作关系深度参与了好几个从传统商业数据库主要是Oracle向国产数据库迁移的项目。其中人大金仓KingbaseES是出场率相当高的一款产品。说实话这个过程远不是改改连接字符串、重新导个数据那么简单更像是一场充满未知的“探险”。你手里拿着一张老地图原有的Oracle应用逻辑却要在一片相似但细节迥异的新大陆金仓上重建家园。我把自己和团队在这一年多里从环境搭建、SQL改写、函数适配到性能调优过程中踩过的坑、总结的经验系统地梳理出来。如果你也正面临类似的国产化迁移任务特别是针对人大金仓V8版本希望这篇记录能帮你少走些弯路把“踩坑”变成“填坑”。2. 环境准备与初识金仓V82.1 为何选择金仓及其V8版本在众多国产数据库中选定人大金仓通常是综合了政策要求、生态兼容性、性能指标和商务因素的结果。金仓的一个核心优势在于它对Oracle语法和特性的高度兼容这能在迁移初期极大地降低应用改造的复杂度。我们项目选用的V8版本是金仓的一个重要迭代它在SQL标准支持、性能优化尤其是高并发和复杂查询场景以及管理工具链上都有显著提升。不过兼容性高也容易让人产生“无需大改”的错觉这正是很多坑的起点。初次部署强烈建议从官网获取最新的安装包或Docker镜像。金仓官方提供了基于不同CPU架构如x86、ARM和操作系统的安装介质。对于想快速搭建测试环境的开发者使用Docker是一种高效的方式。但这里有个细节需要注意金仓的Docker镜像通常包含了数据库实例本身但一些重要的客户端工具如ksql命令行工具、迁移评估工具KDT可能需要单独安装或从镜像中复制出来。注意生产环境部署务必遵循官方的部署手册特别是关于共享内存、内核参数、文件系统建议XFS或EXT4的配置。我们曾在测试环境用默认参数通过到了生产环境大数据量操作时就遇到了共享内存不足导致的诡异崩溃。2.2 基础连接与参数配置差异安装完成后第一个小考验就是连接和基础配置。金仓默认的超级用户是system而非Oracle的sys或PostgreSQL的postgres。端口默认是54321致敬Oracle的1521和PG的5432这也需要在前端连接配置中相应修改。更重要的差异在于一些初始化参数和默认行为。例如Oracle的字符串比较默认是大小写不敏感的而金仓继承自PG内核默认是大小写敏感的。这会导致那些依赖WHERE name ‘SCOTT’这类条件的查询在迁移后可能查不到数据。解决方案通常有两种一是在迁移前对应用代码进行梳理统一大小写规范二是在数据库层面调整但我不推荐后者因为它可能掩盖问题并带来潜在的性能影响。另一个关键参数是NLS_DATE_FORMAT。在Oracle中你可以通过这个参数全局设定日期显示格式。在金仓中虽然没有完全同名的参数但可以通过datestyle、DateStyle等参数来控制日期时间类型的输入输出格式。应用代码中所有隐式依赖数据库默认日期格式进行字符串转换的地方比如TO_DATE(‘2023-01-01’)都必须显式地指定格式模型否则在格式不匹配时会报错。3. SQL语法与DDL迁移避坑指南3.1 数据类型映射的“陷阱”数据类型是数据定义的基石映射不当会导致数据精度丢失、应用异常甚至运行时错误。以下是一些常见的映射场景和注意事项数值类型Oracle的NUMBER(p,s)可以无缝映射为金仓的numeric(p,s)。但对于没有指定精度的NUMBER金仓会映射为numeric(38,10)这可能并非你想要的。如果原字段用于存储整数建议明确指定为numeric(38,0)或直接使用bigint以获得更好的性能。字符串类型Oracle的VARCHAR2和NVARCHAR2对应金仓的varchar和nvarchar。需要关注长度语义Oracle中VARCHAR2(50)表示50个字节在字符集为多字节如UTF-8时可能存不下50个汉字。金仓的varchar(50)通常指50个字符这点更符合直觉但迁移时要注意原表数据是否可能因长度超限而失败。日期时间类型这是重灾区。Oracle的DATE类型同时包含日期和时间对应金仓的timestamp(0)不带时区或timestamptz带时区。TIMESTAMP则对应timestamp(6)默认微秒精度。特别注意金仓没有直接的INTERVAL DAY TO SECOND类型相关逻辑可能需要用interval类型结合函数重写。大对象类型Oracle的BLOB/CLOB对应金仓的bytea/text。但两者的API和存储方式有差异。对于超大对象金仓的TOAST机制可能和Oracle的LOB存储表现不同需要测试性能。3.2 序列与自增主键的切换Oracle常用SEQUENCE配合触发器来实现自增主键或者使用12c以上的IDENTITY列。金仓同样支持SEQUENCE语法高度兼容。但更推荐使用金仓的SERIAL或BIGSERIAL伪类型这本质上是integer/bigint一个关联的序列这更接近MySQL/Auto-increment的风格使用起来更简洁。迁移时如果原表使用触发器填充序列值建议改造为SERIAL。这不仅简化了DDL也避免了触发器带来的额外开销和复杂性。例如-- Oracle风格 CREATE SEQUENCE user_id_seq; CREATE TABLE users (id NUMBER PRIMARY KEY, ...); CREATE TRIGGER trg_users BEFORE INSERT ON users FOR EACH ROW BEGIN SELECT user_id_seq.NEXTVAL INTO :NEW.id FROM DUAL; END; -- 金仓推荐风格 CREATE TABLE users (id BIGSERIAL PRIMARY KEY, ...);3.3 DDL语句的细微差别即使金仓兼容大量Oracle DDL语法细节仍需留意注释添加表注释和列注释的语法相同但要注意中文乱码问题确保客户端和服务端的字符集通常是UTF-8一致。默认值对于日期默认值Oracle的SYSDATE在金仓中应改为CURRENT_TIMESTAMP。对于函数默认值需确保该函数在金仓中可用。约束命名金仓会为未命名的约束自动生成一个名字。为了后续管理方便如在错误信息中清晰定位建议在创建表时为所有主键、外键、唯一约束显式命名。4. 核心函数适配与重写实战函数适配是迁移中最耗时、最体现技术细节的部分。金仓提供了丰富的兼容函数但并非百分之百覆盖。4.1 字符串函数适配字符串处理是业务逻辑的常见操作以下是一些高频函数的转换示例SUBSTR-substring两者功能基本一致但注意参数索引。Oracle的SUBSTR(str, 1, 3)从第1位开始取3位金仓的substring(str from 1 for 3)语法不同但效果相同。金仓也支持substr(str, 1, 3)的Oracle语法。INSTR-strpos查找子串位置。Oracle的INSTR(‘abcde’, ‘c’)返回3金仓的strpos(‘abcde’, ‘c’)也返回3。但INSTR有更多参数如起始位置、第几次出现金仓的strpos不支持需要用split_part或正则表达式函数组合实现。CONCATOracle的CONCAT只支持两个参数多参数拼接用||。金仓的concat函数支持多个参数||操作符也同样可用通常直接替换即可。格式化函数Oracle的TO_CHAR(date, ‘YYYY-MM-DD HH24:MI:SS’)在金仓中完全兼容。但对于数字格式化如TO_CHAR(1234.56, ‘999,999.99’)金仓的格式模型可能略有不同需要测试验证。4.2 日期函数适配日期函数是另一个适配重点业务逻辑中充斥着各种日期计算。SYSDATE-CURRENT_TIMESTAMP或now()获取当前系统时间。ADD_MONTHS金仓V8直接兼容此函数行为与Oracle一致可以放心使用。这是V8对Oracle兼容性增强的一个体现。MONTHS_BETWEEN金仓V8也直接兼容。对于更早的版本可能需要用(EXTRACT(year FROM age(date1, date2)) * 12 EXTRACT(month FROM age(date1, date2)))来模拟但精度有差异。LAST_DAY金仓兼容。NEXT_DAY这个函数在金仓中可能不直接支持。需要自己写一个函数来实现逻辑是找到下一个指定的星期几的日期。例如可以用一个循环或基于日期序列的查询来实现。日期截断TRUNC(date)用于截断到天金仓兼容。对于更复杂的TRUNC(date, ‘Q’)季度、TRUNC(date, ‘WW’)周等需要检查金仓是否支持不支持则需用DATE_TRUNC函数结合计算实现。4.3 数值与聚合函数适配NVL-COALESCE两者功能完全一致COALESCE是SQL标准建议迁移后统一使用COALESCE。DECODE-CASE WHENOracle的DECODE函数是CASE表达式的简写。金仓支持CASE WHEN标准语法也提供了decode兼容函数。但为了代码的通用性和可读性我强烈建议将DECODE改写为标准的CASE WHEN语句。ROWNUM与分页这是最经典的差异之一。Oracle使用ROWNUM进行伪行号限制和分页。金仓使用标准的LIMIT和OFFSET子句或者FETCH FIRST n ROWS ONLY语法。迁移时所有基于ROWNUM的分页查询都必须重写。-- Oracle 分页 SELECT * FROM (SELECT t.*, ROWNUM rn FROM my_table t WHERE ROWNUM 20) WHERE rn 10; -- 金仓 分页 (标准语法) SELECT * FROM my_table ORDER BY some_column LIMIT 10 OFFSET 10;CONNECT BY递归查询Oracle的层次查询语法CONNECT BY PRIOR非常强大。金仓使用SQL标准的递归公共表表达式WITH RECURSIVE来实现。语法完全不同需要重构。这是迁移中的一个难点但WITH RECURSIVE功能更强大、更灵活是值得投入时间学习的。4.4 自定义函数与存储过程迁移对于应用中的自定义PL/SQL函数和存储过程金仓提供了自己的过程语言PL/SQL兼容Oracle和PL/pgSQL。通常简单的函数可以尝试直接迁移复杂的过程则需要重写。语法检查先将Oracle的PL/SQL代码在金仓中创建利用金仓的语法检查功能找出不兼容的关键字、数据类型或内置包调用如DBMS_OUTPUT.PUT_LINE对应金仓的RAISE NOTICE。内置包替换Oracle大量的DBMS_*和UTL_*包金仓只实现了最常用的一部分如DBMS_OUTPUT,DBMS_RANDOM,DBMS_LOB。对于未实现的包功能需要寻找金仓的等效函数或自己用SQL和PL/SQL实现。异常处理Oracle的EXCEPTION WHEN ... THEN ...块语法金仓基本兼容。但异常名称可能不同例如NO_DATA_FOUND在金仓中可能是SQLSTATE ‘02000’。游标处理显式游标的OPEN, FETCH, CLOSE循环可以迁移。但考虑是否能用更简洁的FOR record IN (SELECT ...) LOOP结构重写性能往往更好。5. 性能调优与运维监控要点数据库迁移后性能是否符合预期是项目成功的关键。金仓的优化器与Oracle存在差异。5.1 执行计划分析与索引策略金仓使用基于成本的优化器CBO和Oracle类似。查看执行计划的命令是EXPLAIN和EXPLAIN ANALYZE。重点看什么执行计划中的Seq Scan全表扫描是否在预期之内Index Scan或Index Only Scan是否被正确使用连接Nested Loop,Hash Join,Merge Join的选择是否合理估算的行数rows和实际行数Actual rows是否相差巨大如果估算严重不准通常是因为表统计信息过时。更新统计信息在大量数据迁移或DML操作后务必对相关表运行ANALYZE table_name;或VACUUM ANALYZE table_name;VACUUM还会清理死元组。对于大表可以采样分析ANALYZE table_name (sample_percent);。索引设计除了常规的B-Tree索引金仓还支持GIN通用倒排索引用于全文搜索、数组、GiST广义搜索树用于地理空间、范围类型等。迁移后需要根据新的查询模式特别是重写后的分页、递归查询评估原有索引的有效性并考虑创建新的复合索引或函数索引。5.2 关键配置参数调整默认配置适用于通用场景针对特定负载需要调整。以下是一些关键参数在kingbase.conf中修改shared_buffers数据库服务器使用的共享内存缓冲区大小。通常设置为系统内存的25%-40%。这是最重要的参数之一。work_mem每个排序或哈希操作可使用的内存。对于有复杂排序、聚合或哈希连接的查询增加此值可以避免磁盘临时文件提升速度。但设置过大会导致内存竞争。maintenance_work_memVACUUM,CREATE INDEX等维护操作可用的内存。设置大一些可以显著加速这些操作。effective_cache_size优化器假设操作系统和数据库磁盘缓存的大小。这不会实际分配内存但会影响优化器选择索引扫描还是全表扫描的倾向。通常设置为系统内存的50%-75%。max_connections最大连接数。不要设置过高每个连接都会消耗内存。建议使用连接池如金仓自带的连接池或应用层连接池来管理前端的大量并发请求。5.3 日常运维与监控迁移上线并非终点持续的运维监控至关重要。慢查询日志开启金仓的慢查询日志log_min_duration_statement定期分析找出性能瓶颈。空间监控监控表空间和数据目录的使用情况设置告警阈值。金仓的表空间管理逻辑与Oracle类似。连接与锁监控使用sys_stat_activity视图查看当前活动会话和正在执行的SQL。使用sys_locks视图排查锁等待问题。备份与恢复制定可靠的备份策略。金仓支持逻辑备份sys_dump和物理备份基于PITR。对于大型数据库物理备份结合WAL归档是更高效的选择。务必定期测试恢复流程。6. 常见问题排查与解决方案实录在实际迁移和运维中我们遇到了各种各样的问题这里记录几个最具代表性的案例。6.1 连接数与性能骤降现象应用在高峰时段响应变慢金仓服务器CPU和内存使用率不高但磁盘IO等待明显。排查查看sys_stat_activity发现大量idle in transaction状态的连接。这些连接占用了资源但未释放。检查应用代码发现使用的是简单的JDBC连接没有正确配置连接池或者事务完成后没有及时提交或回滚。解决在应用层引入并正确配置连接池如HikariCP、Druid设置合理的最大连接数、最小空闲数、连接超时和空闲超时时间。确保所有数据库操作都在明确的事务边界内并在操作完成后立即提交或回滚。在金仓端可以设置idle_in_transaction_session_timeout参数自动终止长时间空闲的事务会话。6.2 迁移后查询结果不一致现象一个复杂的多表关联报表在金仓上跑出的合计金额与Oracle原环境有细微差别。排查逐层分解SQL对比中间结果。发现差异出现在一个ROUND函数上。该函数对一列经过多次乘除计算后的浮点数进行四舍五入。深入研究发现Oracle的NUMBER类型是精确数值类型而金仓的numeric也是精确的但计算过程中如果涉及除法可能会产生无限循环小数。Oracle和PG金仓内核对中间计算结果的精度处理规则可能存在微观差异。解决对于财务等对精度要求极高的场景避免在数据库层进行复杂的、多步骤的浮点数计算。可以将计算逻辑移到应用层使用java.math.BigDecimal等精确计算库。或者在SQL中尽量使用整数进行计算最后再转换为小数。例如将金额以分为单位存储整数计算后再除以100。明确指定ROUND、CAST等函数的精度确保行为一致。6.3 函数缺失或行为异常现象应用调用一个自定义的Oracle函数迁移时报“函数不存在”或结果错误。排查确认该函数是否已成功在金仓中创建。检查函数名、参数类型、返回类型是否完全一致。金仓的函数名是大小写敏感的除非创建时用了双引号。如果函数使用了Oracle特有的内置函数或语法如WM_CONCAT聚合字符串需要找到金仓的替代方案。金仓可以使用string_agg函数来实现字符串聚合。使用RAISE NOTICE或sys_debug输出调试信息逐步检查函数内部逻辑。解决建立一份《Oracle-金仓函数映射与重写清单》作为团队知识库。将常见的函数转换模式固化下来。对于复杂的业务函数在迁移后编写对应的单元测试用相同的输入数据验证Oracle和金仓的输出是否一致。考虑使用金仓提供的迁移评估工具如KDT它能扫描应用代码和数据库对象生成一份详细的兼容性评估报告列出所有需要关注的函数和语法点。迁移到国产数据库是一个系统工程技术适配只是其中一环。它考验的不仅是技术人员对两种数据库的熟悉程度更是项目管理和风险控制的能力。我的体会是尽早介入、搭建完整的测试环境、进行充分的功能和性能测试、积累可复用的适配脚本和经验是平滑过渡的关键。金仓V8在Oracle兼容性上已经做了大量工作这让迁移的启动门槛降低了很多但深水区的暗礁依然需要你亲自去探测和标记。最后保持耐心多查官方文档多与金仓的技术支持社区交流很多问题其实都有现成的解决方案。

相关新闻

如何免费解锁WeMod高级功能:Wand-Enhancer完整指南

如何免费解锁WeMod高级功能:Wand-Enhancer完整指南

如何免费解锁WeMod高级功能:Wand-Enhancer完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为WeMod的高级功能付费而烦恼吗…

2026/10/17 10:37:25 阅读更多 →
SFTP协议深度解析:从SSH安全通道到高效文件传输实战

SFTP协议深度解析:从SSH安全通道到高效文件传输实战

1. SFTP核心概念与场景定位如果你经常需要在不同服务器之间、或者从本地向远程服务器安全地传输文件,那么SFTP绝对是你绕不开的一个工具。很多人容易把它和FTP、甚至SCP搞混,但其实SFTP在安全性和功能性上,是另一个维度的存在。简单来说&…

2026/10/17 14:53:02 阅读更多 →
Nacos注册中心:微服务架构中的核心组件解析与实践

Nacos注册中心:微服务架构中的核心组件解析与实践

1. 为什么现代系统离不开注册中心? 第一次接触分布式架构时,最让我困惑的就是服务之间如何互相发现。早期我们采用硬编码IP的方式,每次服务变更都要重新部署,运维同事经常半夜被叫起来改配置。直到接触了注册中心,才真…

2026/10/17 2:09:33 阅读更多 →

最新新闻

H5扫码不是加个库就行:浏览器能力、权限与解码全链路解析

H5扫码不是加个库就行:浏览器能力、权限与解码全链路解析

1. 为什么H5扫码不是“加个库就完事”——从一次线上事故说起去年底,某电商类H5活动页上线后第三天,客服后台突然涌入大量用户反馈:“扫不了码”“摄像头打不开”“点扫码按钮没反应”。当时我正负责该页面的前端维护,紧急排查发现…

2026/10/17 23:11:05 阅读更多 →
从零搭建OpenResearch:自建研究管理平台的技术选型与实操指南

从零搭建OpenResearch:自建研究管理平台的技术选型与实操指南

1. 从零搭建一个OpenResearch:我为什么选择自建研究管理平台第一次听到“OpenResearch”这个词,很多人会以为又是一个学术搜索引擎或者论文聚合站。但真正做过研究、带过团队、或者长期跟踪某个领域进展的人会明白,市面上缺的从来不是“搜论文…

2026/10/17 23:11:05 阅读更多 →
网页动态几何画板嵌入实战:从iframe到JS注入的选型与踩坑

网页动态几何画板嵌入实战:从iframe到JS注入的选型与踩坑

上周收到一个需求,来自某教育产品的同学:“我们的习题页现在只能放静态图片,老师想要那种能拖动滑块、图形跟着变的交互。你们前端能不能做?”我第一反应是这需求不难,画个Canvas,加几个滑块,监…

2026/10/17 23:11:05 阅读更多 →
纯CSS水波特效:充电状态视觉反馈的轻量实现方案

纯CSS水波特效:充电状态视觉反馈的轻量实现方案

1. 从“充电”这个动作说起:为什么水波特效比进度条更抓人手机充电这个场景,大家每天都要经历至少一次。但你有没有注意过,绝大多数充电界面的视觉反馈就是一个电池图标加百分比数字,顶多再配一个闪电符号。功能上完全够用&#x…

2026/10/17 23:11:05 阅读更多 →
JavaScript零基础入门:从浏览器交互到可部署小项目

JavaScript零基础入门:从浏览器交互到可部署小项目

简介:本资源是邵山欢主讲的JavaScript免费公开课配套资料及课堂笔记,专为零基础前端学习者设计,系统覆盖语法基础、DOM/BOM操作、事件处理、函数与闭包、异步编程、面向对象、ES6新特性及Node.js入门等核心模块,助力初学者构建扎实…

2026/10/17 23:11:05 阅读更多 →
NPDP备考核心:从产品创新工具到组合管理的实战指南

NPDP备考核心:从产品创新工具到组合管理的实战指南

简介:《NPDP Body of Knowledge-2nd》是产品开发与管理协会(PDMA)官方出版的产品创新与产品管理知识体系指南,主要面向备战NPDP认证考试的产品经理和产品开发从业者,也适合希望系统构建产品创新方法论的初中级产品人员…

2026/10/17 23:10:03 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →