Oracle迁移瀚高数据库:rownum替换方案与分页改写全攻略
直接说结论把Oracle迁到瀚高最让人头大的就是rownum。这玩意儿在Oracle里写得太顺手了一到瀚高环境里SQL报错都不带商量的。市面上讲Oracle分页的帖子一大把讲瀚高方言的也不少但专门围绕“rownum怎么替、为什么这么替、替完会不会变慢”来写的还真不多。这篇就只聊这一件事把替换方案、原理和踩坑过程一次说透。我先把话说清楚瀚高数据库HighGo Database本质上走的是PostgreSQL路线语法和函数体系大量沿用PG的实现。而Oracle的rownum是查询执行过程中动态生成的伪列这个机制在瀚高里根本没有也不能靠简单的“同义词映射”搞定。所以真实迁移项目里但凡SQL里出现过rownum就必须由人肉逐条改写。这事看着小实际影响面很大——分页、去重、TOP-N、存储过程、报表查询到处都会冒出来处理不好就是线上事故。在动手写替换脚本之前值得先花两分钟把Oracle里rownum的“脾气”摸清楚。它跟你想的那种“结果集编号”完全不一样我把它当成一个带秩序的编号器来理解Oracle拿到查询结果后每输出一行就给这行临时编一个号从1开始而且只在输出时发号。这意味着rownum的大小判断必须先于排序和分组生效写条件时稍微顺手一点结果就能完全出乎意料。举个例子大家最熟悉的分页写法SELECT * FROM ( SELECT t.*, rownum AS rn FROM employees t WHERE t.department_id 60 ORDER BY t.salary DESC ) t WHERE rn BETWEEN 11 AND 20;里层的rownum AS rn并不是在排完序的那一刹那就固定下来的它是在子查询结果集真正往外吐数据时现算的。如果不套这三层嵌套直接在原表上rownum 20查出来的根本不是“薪资最高的20个人”而是“前20个入库的人”。这也是rownum最坑人的地方不是它不能分页而是它的执行语义跟阅读SQL的顺序完全是两回事。到了瀚高这里数据库引擎在处理排序、分页时走的是另一套逻辑它支持标准SQL里的LIMIT / OFFSET语法也支持标准的窗口函数ROW_NUMBER()。这意味着迁移时不用去造轮子直接用这两个替代方案就够了。不过替代不是无脑搜索替换要分场景、分写法来处理。我先给大家一个判断框架原始SQL场景推荐替代方案优先级纯分页取第N页数据LIMIT ? OFFSET ?直接改写最高TOP-N取前N行LIMIT N改写最高分页时需要行号字段如序号列ROW_NUMBER() OVER (ORDER BY ...)次之存储过程动态拼接分页建议封装成通用函数或模板次之更新/删除部分记录时用rownum N改用子查询 主键过滤最低这个优先级不是拍脑袋定的是根据性能和改造工作量排出来的。能用LIMIT的绝不用ROW_NUMBER()因为ROW_NUMBER()需要额外的排序和缓存步骤在数据量大时会拉高内存和CPU开销而LIMIT是数据库内部直接支持的取数操作执行计划更短。有了判断框架下面来点硬核实操。我最常碰到的就是这种老系统里一个“查第11到20条数据”的分页查询Oracle写法长这样SELECT * FROM ( SELECT t.*, rownum AS rn FROM ( SELECT emp_id, emp_name, salary FROM employees WHERE status ACTIVE ORDER BY salary DESC, emp_id DESC ) t ) t WHERE rn BETWEEN 11 AND 20;这种SQL有个特点三层嵌套最内层负责筛选和排序中间层负责加行号最外层负责掐行号范围。看完刚才的机制分析你应该能理解为什么要这么绕了——不绕的话rownum会在排序之前就发完号分页就乱了。迁到瀚高我推荐直接砍掉两层子查询只留原始条件再用LIMIT / OFFSET收尾SELECT emp_id, emp_name, salary FROM employees WHERE status ACTIVE ORDER BY salary DESC, emp_id DESC LIMIT 10 OFFSET 10;这里每人一个坑LIMIT后面的数字是“每页几条”OFFSET后面的数字是“跳过几条”。第11到20条就是LIMIT 10 OFFSET 10也就是跳过10条、要10条。很多初次从Oracle转过来的同事容易把OFFSET算错写成OFFSET 11结果就会漏掉第11条。算偏移量的时候别心算直接在纸上写公式OFFSET (当前页号 - 1) * 每页条数。但注意如果这个SQL只是临时查询怎么改都随你。如果要改造成产品里的通用查询接口那就要多考虑一步——页码和每页条数通常由前端传参不是写死的。这时可以这样写SELECT emp_id, emp_name, salary FROM employees WHERE status ACTIVE ORDER BY salary DESC, emp_id DESC LIMIT #{pageSize} OFFSET #{offset};参数化处理之后SQL模板通用性马上就出来了不同页面复用同一套逻辑也不怕参数拼错。说完最简单也最常用的分页改写再来看一个我实际迁过且折腾了半天的场景多表关联 分组统计 分页一条SQL同时用了聚合、连表和rownum。Oracle里顺手就写了SELECT * FROM ( SELECT d.dept_name, COUNT(a.emp_id) AS emp_cnt, ROUND(AVG(a.salary), 2) AS avg_salary, rownum AS rn FROM employees a JOIN departments d ON a.dept_id d.dept_id WHERE a.hire_date DATE 2018-01-01 GROUP BY d.dept_name ORDER BY emp_cnt DESC, avg_salary DESC ) t WHERE rn BETWEEN 1 AND 10;这种写法里有两个细节值得注意一是GROUP BY后直接ORDER BY使用别名emp_cnt在Oracle的特定版本里能过在瀚高里就得琢磨一下二是ROWNUM在这里的作用是给分组结束后排好序的结果编行号然后取前10名语义上类似“集团/部门排名TOP10”报表。搬到瀚高我采用的方案是内层保留分组和排序外层用LIMIT截断不再包两层SELECT d.dept_name, COUNT(a.emp_id) AS emp_cnt, ROUND(AVG(a.salary), 2) AS avg_salary FROM employees a JOIN departments d ON a.dept_id d.dept_id WHERE a.hire_date DATE 2018-01-01 GROUP BY d.dept_name ORDER BY emp_cnt DESC, avg_salary DESC LIMIT 10;这里架构简化后有个新增的潜在风险ORDER BY里用的别名emp_cnt在瀚高里完全合法没问题但如果在条件里还想用HAVING emp_cnt 5优先级就得小心了。SQL的执行顺序是WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT别名在HAVING阶段还没有生效所以不能直接引用。别笑这种坑我见过不止一次报错信息还各不相同有的库直接提示列不存在有的库会把它当成一个新列来解析结果数据完全不对。多表关联分页还有一个隐藏雷区多张表里如果有相同的列名比如employees和departments里都有name或remark字段外层查询不加表别名限定就会报“列名歧义”。Oracle对这种情况相对宽松但瀚高对命名规范要求更严直接SELECT *的时候很容易中招。所以我建议迁移这种查询时顺手把SELECT *改成显式列名虽然前期费点事但后面维护能少掉很多“灵异现象”。还有一类场景不是分页但也很高频——取“最新的一条记录”说白了就是rownum 1。Oracle里常见两种写法SELECT * FROM ( SELECT t.* FROM orders t WHERE t.customer_id 1001 ORDER BY t.created_at DESC ) t WHERE rownum 1;另一种更省事但更危险的写法是直接在原表上过滤rownum 1完全不做排序。这两种写法迁到瀚高之后逻辑可以统一成LIMIT 1SELECT t.* FROM orders t WHERE t.customer_id 1001 ORDER BY t.created_at DESC LIMIT 1;先别急着高兴这里有个很隐蔽的问题LIMIT 1只保证“取一行”不保证“取到的那一行就是符合排序条件的那一行”。这句话听起来有点绕实际操作中要特别注意如果ORDER BY字段不是唯一的比如多个订单的created_at恰好相同那LIMIT 1返回哪一行取决于数据库的索引扫描顺序或物理存储顺序可能这次返回A单、下次返回B单。要解决这个问题建议在ORDER BY后面追加一个唯一字段作为决胜排序比如ORDER BY created_at DESC, order_id DESC LIMIT 1;这样结果才是确定性的。在Oracle里rownum 1也有同样问题但由于老的业务系统往往跑了很多年数据特征稳定大家很少注意到这种不确定性。迁库换引擎后排序规则、存储结构都变了这种隐患会被放大必须在排查阶段逐个确认。除了分页和取首行存储过程里也藏着一堆rownum。Oracle的存储过程里经常为了“每个部门取前3名”写这种SQLSELECT * FROM ( SELECT e.emp_name, e.salary, e.dept_id, ROW_NUMBER() OVER (PARTITION BY e.dept_id ORDER BY e.salary DESC) AS rn FROM employees e ) t WHERE rn 3;这个写法其实用的是ROW_NUMBER()窗口函数不是rownum伪列所以本身不牵涉替换。但麻烦在于Oracle老代码里还有不少混着用的写法比如在外层再套一层rownum来限制总条数或者用ROWNUM来控制游标循环次数。迁到瀚高后这类SQL要特别留神第一瀚高支持ROW_NUMBER()语法上可以直接保留不用改。但窗口函数在PG系数据库里的执行计划跟Oracle有差异分组很多或数据量很大时性能需要实际压测不能想当然觉得能跑通就行。第二存储过程里如果还有“循环按页取数”的逻辑比如FOR i IN 1..total LOOP ... WHERE rownum i ...这种写法要重写。瀚高存储过程支持FOR ... LOOP但SQL里的rownum必须替换成LIMIT而且要特别留意动态SQL拼接时参数类型。比如我用过一段动态模板可能在Oracle里是这样写的EXECUTE IMMEDIATE SELECT * FROM (SELECT t.*, rownum rn FROM || v_table || t ORDER BY 1) WHERE rn BETWEEN :1 AND :2 USING v_start, v_end;改成瀚高写法先别急着把字符串里的rownum直接换成ROW_NUMBER()而是要先把整段SQL理解清楚。由于表名是动态传入的无法预知排序字段我通常建议这样改EXECUTE IMMEDIATE SELECT * FROM || v_table || ORDER BY 1 LIMIT :1 OFFSET :2 USING v_page_size, v_offset;不过这个方案有个硬前提表的第一列必须是可以排序的字段。遇到那种第一列是文本类型或者没有实际排序意义的表就得要求调用方显式传入排序字段否则宁可不支持动态表名也不能让ORDER BY 1就这样裸奔在生产环境里。这里我想插一句关于工具链的建议。实际迁移项目里很多人会在DBeaver或Navicat里手工跑SQL来验证替换结果但DBeaver默认可能没有配置瀚高驱动还需要手动添加。这个步骤本身不难但版本选不对也会卡住。建议去瀚高官方文档或对应的数据库发布渠道下载适配DBeaver的JDBC驱动不要拿PG的驱动硬顶。虽然瀚高和PG协议兼容度很高但部分API差别可能影响连接参数特别是认证方式。曾经有同事遇到连不上库、报password authentication failed for user sysdba之类的问题排查半天发现是驱动版本和认证插件不匹配换成瀚高官方驱动后一次就通了。这类问题不是本篇文章主角但如果你在做实际迁移建议提前把驱动环境搭好省得后面验证SQL时浪费时间。继续回到核心替换逻辑。还有一种高频场景是“更新/删除前N行”Oracle里会写UPDATE employees SET status ARCHIVED WHERE emp_id IN ( SELECT emp_id FROM employees WHERE status ACTIVE AND rownum 100 );瀚高里不能用rownum直接改成LIMIT 100在子查询里取前100个主键。但要注意如果原表在更新过程中会被并发修改这种“先取id再更新”的方式本身就有并发一致性风险。稳妥做法是UPDATE employees SET status ARCHIVED WHERE emp_id IN ( SELECT emp_id FROM employees WHERE status ACTIVE ORDER BY emp_id LIMIT 100 );这里有一个关键点LIMIT 100没有ORDER BY时子查询取出的100个id是随机的批量更新后剩下的数据不可预期。加上ORDER BY emp_id之后批量处理的行为才是稳定的。对数据订正类脚本来说可重复执行、结果可预期比“速度够快”重要得多。还有个特殊写法Oracle的ROWNUM有个著名的“只能从1开始”限制很多人知道但不能完全理解我在这里多说一句直接写ROWNUM 2是永远查不到数据的因为Oracle给第一行编号1后发现ROWNUM不等于2第二行还没编号就被丢掉了。这种写法的本意多半是“跳过第一行”在瀚高里应该用OFFSET 1 LIMIT 1来表达或者用FETCH FIRST 1 ROW配合OFFSET。瀚高对标准SQL的FETCH FIRST也有支持不过实际习惯上还是LIMIT/OFFSET用得最多各团队保持一致就好。到了这里我猜你已经能分辨替换时该选哪个方案了。不过选对方案只是第一步真正决定替换质量的往往是最后那一步验证。我见过不少人改完一条分页SQL后面看着页码和行数都对就以为万事大吉结果在数据量超过20万行之后接口响应从几十毫秒直接变成几十秒为什么会这样呢因为OFFSET越来越大的时候数据库不是“跳过前面几行”就完事了它要把前面所有行都读出来丢掉再返回目标行。越往后的页码代价越高。这种深分页问题是Oracle老代码里基本没考虑过的因为Oracle习惯上会配一层统一的分页框架或做索引加速而PG系的LIMIT/OFFSET在深度偏移时性能更敏感。解决办法有三个方向第一限制最大偏移量。在业务层如果发现页码超过某个阈值比如10万行直接提示用户缩小查询范围而不是无限翻页。这个最简单但治标不治本。第二改用“游标分页”或“键集分页”。也就是把“翻到第几页”改成“拿上一页最后一条记录的排序字段值作为下一页的起点条件”。比如按created_at排序分页上一页最后一条的created_at是2025-06-01那下一页的SQL就写成SELECT ... FROM orders WHERE created_at 2025-06-01 ORDER BY created_at DESC LIMIT 10;这种写法避开了大偏移量的全量扫描不管翻到多深SQL都只读目标范围内那几条数据。代价是前端传参逻辑要改无法随便跳页。对于“列表无限下滑”这种常见的移动端/前端产品形态这个方案特别合用。第三如果必须支持深分页且排序字段可索引也可以考虑在OFFSET前后把查询拆成“先查主键再回表”——但这只适合特定数据分布手头没有实际执行计划别轻易套用。先把这些坑排完再实际看看迁移后怎么验证。我的习惯是在瀚高里做三层核对第一步核对总条数。把Oracle原SQL去掉rownum相关的部分改成纯COUNT记录总数再到瀚高里用同样的条件跑COUNT数量必须一致。这一步能排掉过滤条件不对、表重复关联、数据本身没迁干净等问题。第二步核对首尾记录。取第一页和最后一页的数据把emp_id、order_id这类主键列拉出来对比。重点不是看某一页内容是否一致而是确认集合边界一致。因为多数迁移项目里历史数据本身在Oracle和瀚高可能因为编码、精度问题有细微差异如果边界都对不上说明替换逻辑有系统性问题要倒回去查条件。第三步核对重复和缺失。这步通常用一个通用SQL模式来做比如把要对比的数据按主键取并集看哪一边多出来、哪一边缺失。人工一页一页翻是不现实的也容易漏。写个小的对比脚本用主键在两侧各取一次然后做差集效率高也放心。有朋友可能还想问既然替换这么麻烦能不能直接在瀚高里开一个兼容模式让rownum自动生效我明确说不要抱有这种幻想。瀚高虽然做了不少Oracle兼容性适配有些版本里甚至能支持部分Oracle风格的包、函数、双引号标识符但rownum这个机制牵涉到SQL执行器的内部逻辑不是靠一个开关就能模拟出来的。就算某些兼容模式提供了特殊处理它的执行效率和细节语义也未必能完全对齐Oracle用起来提心吊胆还不如在迁移阶段就一鼓作气改干净。另外迁移时还有一类SQL容易踩坑原本在Oracle里通过字符串拼接构造出来的SQL比如用||拼接表名、字段名到瀚高可能需要改成其他写法。rownum在这个过程里经常被漏掉因为它的出现形式太隐蔽了。比如动态SQL模板里可能是WHERE || v_condition || AND rownum 10这种字符串在代码里一搜一大把。所以我建议迁移团队在代码搜索时不要只搜rownum还要搜ROWNUM、Rn、RN覆盖所有大小写混合的情况。很多老代码里变量命名还喜欢用rn跟别名冲突时排查难度直接翻倍。关于替换方案的取舍我再补一个很容易混淆的点有些地方看起来用ROW_NUMBER()很合适但最终实现时我却选了LIMIT。原因是ROW_NUMBER()是需要把所有数据都读进来、进行窗口排序之后才能标出行号数据量大时成绩很差。在只需要“取前N条”的典型场景里LIMIT的执行计划通常更优因为它可以在排序过程中提前终止——只要喂满了N条后面的记录就不用排了。所以不能说一种方案通吃所有场景而是每看到一个rownum都要先想清楚它承载的是“行号”还是“行数”。顺带提一个很多人可能忽略的必然影响迁移之后不只SQL代码要动ORM映射里的分页插件也可能要跟着调。有些Java项目里用MyBatis的分页插件它在Oracle和瀚高之间如果配置了方言可能会自动生成不同的分页SQL。这个环节里rownum的替换不是手工改的而是由插件方言包完成的。迁移时如果没换方言包或方言配置里写的还是Oracle分页插件会继续生成带有rownum的SQL结果照样跑不起来。这个排查点普通开发容易漏因为它根本不是手写SQL却会让报错信息反复出现在日志里。给个提醒迁移瀚高后一定要在配置文件里检查分页方言别让框架层面给你悄悄“保留”了Oracle语法。那我平时在实际项目里是怎么组织整个替换工作的呢分享一下我的工作节奏第一步先做代码扫描和资产盘点。用代码搜索把rownum出现的所有文件列出来按模块分组分成“SQL文件”“Java代码”“存储过程”“报表配置”四类。每类单独评估。第二步按照上一节说的优先级对每条SQL做人工分类纯分页、TOP-N、行号序号、特殊语义、动态SQL。每种类型对应一个改写模板团队改的时候不用每次都从头设计效率高很多也容易保持一致。第三步改完一批就做一次数据对比验证不只是看语法能跑通还要看返回内容是不是跟Oracle一致。这一步宁可慢一点也不要堆积到最后统一验证不然排查成本成倍增加。最后在测试环境做一轮全量回归重点看深分页性能、并发场景下的稳定性以及存储过程调用的完整性。Oracle和瀚高在事务隔离级别、锁行为上也有差异分页没错不代表整体无问题不过那些属于另一篇文章的范畴了。代码层面我还用一个很小的Python脚本辅助验证免得总靠手动翻结果。思路是提取Oracle侧某查询的总条数和分页结果然后连接瀚高跑对应的替换SQL再把两边结果集按主键做对比。我没有在这个脚本里写太复杂的东西只负责把两边结果的差异输出来# 用 pyodbc / psycopg2 连接两库拉取指定分页SQL的结果 # 按主键转成set后做差异对比输出缺失/多余记录 def diff_rows(oracle_rows, highgo_rows, key_cols): o_keys {tuple(r[c] for c in key_cols) for r in oracle_rows} h_keys {tuple(r[c] for c in key_cols) for r in highgo_rows} missing o_keys - h_keys extra h_keys - o_keys return missing, extra这种脚本不用维护用完就扔但能在迁移周报中给出挺直观的数字。比如“10张核心表分页全集对比缺失0条、多余0条”一下子就能打消很多人的顾虑。再花点篇幅补一个典型踩坑案例给正在迁移的朋友提个醒。有一次我接手一个老系统的迁移任务里面有段报表SQLOracle版本里是SELECT * FROM ( SELECT t.id, t.amount, ROW_NUMBER() OVER (ORDER BY t.amount DESC) AS rn FROM trans t ) t WHERE rn 50 AND rownum 10;当时组里有同事看到rn 50 AND rownum 10觉得冗余直接改成了SELECT * FROM ( SELECT t.id, t.amount, ROW_NUMBER() OVER (ORDER BY t.amount DESC) AS rn FROM trans t ) t WHERE rn 50 LIMIT 10;表面看着没问题实际跑出来的结果跟原来差远了。因为Oracle原SQL的语义是先给所有行按金额降序标行号取前50再从这50里随意取前10。这个“随意”在Oracle里是跟物理读取顺序相关而迁移后LIMIT 10是直接取窗口函数排序后的前10。两个结果集的交集可能一模一样但在排序字段有重复值且数据量大的情况下差异肉眼可见。改完不是语法过不去而是“结果不对”——这是替换时最难发现的一类问题因为它们不会报错只会让你对着数据发呆。结论就是碰到rownum和ROW_NUMBER()同时出现的SQL别急着合并先把原始语义完整还原清楚。还有个跟性能强相关的问题取最新一条记录。Oracle老代码里看到最多的就是“先子查询排序再套rownum 1”这种写法在数据量小的时候没事一旦某个客户表里有上百万订单每次查询都要全表排一次序就受不了。迁到瀚高后改成ORDER BY created_at DESC LIMIT 1如果created_at有索引执行计划会好很多如果没索引性能跟之前在Oracle里一样会烂但这已经不是迁移本身的问题而是建表时就该规划好的索引策略。所以我建议迁移时顺手把这种高频LIMIT 1查询涉及的排序字段检查一遍索引别到最后优化阶段再来追。如果把所有问题汇总成一个速查表大概长这样问题现象根因排查与解决分页SQL语法报错rownum在瀚高里不存在改成LIMIT/OFFSET或ROW_NUMBER()第1页正常最后一页明显变慢深分页导致OFFSET扫描过大键集分页或限制最大偏移量分页结果顺序不对缺少稳定排序字段ORDER BY增加唯一字段返回行数正确但内容不同rownum和ROW_NUMBER()混用时语义被合并恢复原始嵌套语义页面显示行号从1开始但总数不对外层COUNT被LIMIT干扰拆开计数用原始过滤条件单独COUNT存储过程里动态SQL报错字符串中rownum未替换全局搜索大小写变体替换为LIMIT分页插件的SQL仍是Oracle方言方言配置没切到瀚高检查MyBatis/其他ORM插件方言包数据量不大但迁移后速度下降索引缺失或排序列无索引按迁移后的高频查询补索引多表关联时列名歧义多表同名列被SELECT *带出显式列名 表别名限定这张表我通常直接贴到项目的迁移Wiki首页团队里谁遇到相似问题先去查一轮很多重复答疑就不用找我了。最后再聊聊我对这种迁移的整体感受。数据库迁移这件事很多时候难点不是迁移工具怎么用也不是数据怎么搬运而是老代码里那些看似不起眼的语法习惯换个环境就变成最深的水坑。rownum恰好是这类问题的典型代表在Oracle里它是所有开发者的老朋友写得无比自然到了瀚高它却成了最响的“语言报警器”——只要你在这里踩一次坑就说明你已经进入了新的兼容生态不能再用Oracle的思维惯性写SQL了。如果非要说一个最值得带走的经验我会说改rownum之前先别急着写代码花五分钟把原SQL的“数据流动过程”讲给自己听。你只要能把“哪一步筛选、哪一步排序、哪一步取前N、哪一步标行号”的次序理清替换方案自己就会浮出来。次序理不清任何现成的改写模板都可能翻车。这不是技巧这是方法论。提示如果你正在做Oracle到瀚高或其他国产库的迁移建议把本篇提到的场景列成一个checklist分批验证每改一类就回归一类别等全部改完再统一测。分页问题藏得深越早发现越省成本。

相关新闻

634张猪只检测数据集:双格式标注下的YOLO微调训练全指南

634张猪只检测数据集:双格式标注下的YOLO微调训练全指南

简介:面向猪只检测与计算机视觉训练应用,这份数据集收录约六百三十四张猪只图片,并为每张图片同时提供VOC格式的xml标注和YOLO格式的txt标注,类别统一为猪。数据用labelImg标注,遵循目标边界准确、目标尽量全标、多人标…

2026/10/6 5:53:27 阅读更多 →
AI应用上下文管理:context-mode三种实现模式与实战避坑

AI应用上下文管理:context-mode三种实现模式与实战避坑

1. 拆解"context-mode":为什么上下文管理才是AI应用的隐形命门做AI应用开发的朋友,对"context-mode"这个词肯定不会陌生。但说实话,我见过太多人把上下文管理当成一个简单的"窗口长度"问题——模型支持8K、32K…

2026/10/6 5:52:12 阅读更多 →
Makefile核心语法与高效构建实战:从零手写到报错排查

Makefile核心语法与高效构建实战:从零手写到报错排查

如果你写过由多个源文件组成的C/C项目,一定不会对Makefile感到陌生。这东西乍看就是一堆“目标: 依赖”和缩进命令,可一旦写得不对,光是“make: *** 没有指明目标并且找不到makefile”这一个报错,就能卡住新手半小时。Makefile核心…

2026/10/6 4:01:30 阅读更多 →

最新新闻

工控AI的本质:实时性、确定性与工艺语义的深度融合

工控AI的本质:实时性、确定性与工艺语义的深度融合

1. 工控AI不是“把模型搬进车间”——先破三个行业幻觉工控AI这个概念,最近两年在自动化展会、行业白皮书和厂商宣传稿里高频出现,但翻遍市面上绝大多数所谓“工控AI解决方案”,你会发现一个尴尬事实:90%以上只是把通用大模型API调…

2026/10/6 6:32:32 阅读更多 →
程序跑着跑着为什么会“假死”,看门狗为什么也救不了?

程序跑着跑着为什么会“假死”,看门狗为什么也救不了?

嵌入式设备最让人头疼的一类故障,往往不是“上电就不能运行”,而是: 刚开始一切正常,运行几个小时甚至几天以后,突然没有任何响应。 通信停止了,按键没反应,控制逻辑也不再运行。 但奇怪的是: 按一下复位键,设备马上又恢复正常。 于是工程师通常会想到: “是不是程…

2026/10/6 6:32:32 阅读更多 →
工控AI落地核心:边缘实时性、工业语义理解与闭环可信控制

工控AI落地核心:边缘实时性、工业语义理解与闭环可信控制

1. 这份报告不是“预测”,而是工控现场工程师的五年实操路线图“工控AI发展方向深度研究报告(2026-2030)”——看到这个标题,很多同行第一反应是:又一份堆砌术语、罗列概念的PPT式行业白皮书?我干了13年自动…

2026/10/6 6:32:32 阅读更多 →
Codex 从代码到智能体:安装配置、踩坑排查与接入 DeepSeek 全记录

Codex 从代码到智能体:安装配置、踩坑排查与接入 DeepSeek 全记录

同事发来截图说 Codex 又罢工了:cc switch local proxy failed while handling codex endpoint /responses。我第一反应是“网络抽风”,直到自己在项目里跑了一遍,才意识到这类工具从“代码生成大模型”真正变成“软件工程智能体”之后&#…

2026/10/6 6:32:31 阅读更多 →
国标交流充电桩七根线详解:从线色到接线验收一次讲清

国标交流充电桩七根线详解:从线色到接线验收一次讲清

干了这么多年充电桩安装和售后,被问得最多的不是“这个桩多少钱”,而是“师傅,这枪线里到底哪根是哪根”。尤其遇到三相桩、单相桩混着接,或者线缆颜色不标准的时候,拿万用表一根一根量也能量晕。交流充电桩别看结构简…

2026/10/6 6:32:31 阅读更多 →
批量采集API接口前为什么要做预检?从preflight到get_lesson的工程实践

批量采集API接口前为什么要做预检?从preflight到get_lesson的工程实践

我手里这套小工具一直没正经写过实测记录,今天把misakanet_get_lesson和misakanet_preflight这两个函数放在一起完整跑了一遍,补上这篇记录。起因不复杂:我需要批量把课程平台里自己有权限的课程内容拉到本地做离线整理和笔记拆解。一开始工具…

2026/10/6 6:31:31 阅读更多 →

日新闻

杰理AC7916A硬件设计全指南:电源、时钟与射频三大关键

杰理AC7916A硬件设计全指南:电源、时钟与射频三大关键

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

2026/10/6 1:01:12 阅读更多 →
探针座选型指南:从需求梳理到验收避坑,稳稳解决半导体测试难题

探针座选型指南:从需求梳理到验收避坑,稳稳解决半导体测试难题

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

2026/10/6 1:01:36 阅读更多 →
SO-DIMM内存设计指南:DDR3与DDR4引脚、拓扑、布线及调试

SO-DIMM内存设计指南:DDR3与DDR4引脚、拓扑、布线及调试

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

2026/10/6 1:01:44 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 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/4 11:40:45 阅读更多 →
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/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练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/6 1:18:13 阅读更多 →