MySQL排序规则冲突:Illegal mix of collations报错排查与修复实战

1. 报错现场:先用"翻译法"看懂这条Java异常在说什么

下午三点多,测试环境突然开始刷日志,一条异常卡在中间特别扎眼:

Caused by: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='

第一次见到这个报错的人,大概率会愣上几秒。Java应用里的SQL看着完全正常,无非就是几个表JOIN一下、WHERE条件过滤一下,怎么突然就抛出一个"非法的排序规则混合"?更诡异的是,这个错误往往不是一开始就出现,而是业务跑了一阵子、数据量上来了、某个新接口上线之后,才冷不丁冒出来。

先把这句话翻译成人话:MySQL在执行比较操作时,发现参与比较的两个字符串值,各自携带的排序规则(collation)不一样,而两边又都没有"显式指定"该用哪个规则,MySQL拿不定主意,干脆拒绝执行,把决定权抛回给应用层。

这个报错最常见的出没地点是JOIN关联查询、子查询中的等值比较、UNION合并结果集以及INSERT ... SELECT这类需要逐行比较的场景。而且它有个非常磨人的特性:不一定每次都触发。如果某次查询的WHERE条件里带了个普通字符串常量,MySQL还能强制把常量转换成字段的排序规则,错误就被暂时绕过去;一旦换成两个字段直接比较,冲突就立刻爆发。所以线上经常出现"同一个接口一会儿好一会儿坏"的灵异现象。

这篇文章要聊清楚的,就是这条异常的完整来龙去脉:字符集和排序规则到底是什么关系、为什么两张表会出现两套排序规则、如何从一片日志里快速定位肇事字段、以及修复和预防的完整套路。我尽量用实际排查过的场景来讲,而不是丢一堆文档定义。

2. 两个基础概念:字符集、排序规则与IMPLICIT的含义

2.1 字符集管存储,排序规则管比较

很多人把字符集(character set)和排序规则(collation)当成一回事,其实它们是完全不同的两个维度。打个比方:字符集是"字典",决定一个字符用什么样的二进制编码存进磁盘;排序规则是"裁判",决定两个字符串比较大小、判断是否相等时,按照什么语言习惯来裁决。

拿utf8和utf8mb4来说,它们是字符集,管的是存储编码。而utf8_general_ci、utf8_unicode_ci、utf8mb4_0900_ai_ci是排序规则,管的是比较逻辑。同一个字符集下面可以挂多个排序规则,所以字符集相同并不代表排序规则相同,这是很多人踩坑的第一层误区。

后缀里的_ci是 case insensitive 的意思,说明比较时不区分大小写,'abc' = 'ABC'会成立。如果看到_bin后缀,那就是二进制逐字节比较,区分大小写,速度最快但功能最简陋。绝大多数业务系统用的都是_ci系列。

2.2 utf8_general_ci 和 utf8_unicode_ci 的差异有多大

utf8_general_ci是MySQL早期默认使用的排序规则,设计思路是"简单快速",直接按字节位做映射比较。它的代价是准确性打折:很多带重音符号的拉丁字符会被它粗暴地当成基本字母来比较,比如ä、ö、ü会被当成a、o、u处理。

utf8_unicode_ci则基于更完整的Unicode排序算法(UCA),能正确处理各种扩展字符、连字、特殊符号的比较和排序,准确性明显更好,代价是计算量略大、性能稍微慢一点点。

这个差别听起来只在欧洲语言环境下有影响,其实中文业务也会遇到。最典型的例子就是生僻汉字和全角半角符号混用的数据,在不同排序规则下,相等性判断的结果可能不一致。更重要的是,一旦两张表里的关联字段用了不同排序规则,JOIN时MySQL可能直接拒绝执行,跟数据内容长什么样完全无关。

2.3 说服力等级:为什么字段对字段才会打起来

报错信息括号里的IMPLICIT是整个问题的关键线索。MySQL会给每个参与比较的字符串表达式贴一个"说服力等级"标签,官方术语叫 coercibility:

  • EXPLICIT:表达式里显式写了COLLATE ...,说服力最高,谁都不能跟它争。
  • IMPLICIT:值来自某个表的字段,排序规则由字段定义决定,说服力中等。
  • COERCIBLE:纯字符串常量/字面量,说服力最低,可以被任何列"同化"。

MySQL的比较规则是:EXPLICIT 大于 IMPLICIT 大于 COERCIBLE,等级高的赢。问题就出在两个字段都是 IMPLICIT、排序规则又不同的时候——你说你的utf8_general_ci对,我说我的utf8_unicode_ci对,谁也不服谁,MySQL只能报错。

这也解释了一个常见现象:拿字段和字符串常量比较一般不报错,字段和字段比较却经常爆雷。因为常量是 COERCIBLE,可以被字段"同化",而两个 IMPLICIT 字段之间没有让步机制。

3. 排查链路实录:从一段报错SQL到两张"互不相认"的表

遇到这类错误,最忌讳的是直接改代码,在SQL里硬凑一个COLLATE先跑通——那是救火,不是治本。正确姿势是先定位,再修复。下面用一个我在实际工作中处理过的场景来演示完整排查链路。

3.1 第一步,拿到完整SQL和堆栈出处

异常信息一般长这样,注意看Caused by之前的堆栈:

org.springframework.dao.InvalidDataAccessResourceUsageException: ... Caused by: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:xxx)

从堆栈里往上翻,找到应用层调用的DAO方法,再把对应的Mapper文件打开,把完整的SQL语句捞出来。如果项目没开SQL日志,建议临时打开MyBatis的日志配置,或者用p6spy这类工具把SQL打印到文件。拿不到完整SQL就盲目去查库结构,等于闭着眼睛找针。

我当时捞出来的SQL大概长这样:

SELECT o.order_no, u.user_name, u.phone FROM orders o LEFT JOIN users u ON o.user_id = u.id WHERE o.created_at >= '2024-01-01 00:00:00'

乍一看一点问题都没有,标准得不能再标准。

3.2 第二步,用SHOW CREATE TABLE对比关联字段

拿到SQL后,把JOIN和WHERE涉及的表全部拉出来看定义:

SHOW CREATE TABLE orders\G SHOW CREATE TABLE users\G

重点观察字符串字段的CHARACTER SET和COLLATE两行。我当时一眼就发现了问题:orders表里的user_id是utf8_unicode_ci,而users表的id是utf8_general_ci。两表JOIN一执行,o.user_id = u.id就是标准的"打架现场"。

这种跨表不一致,绝大多数是建表历史造成的:老表是早期脚本建的,那时候用的是默认的utf8_general_ci;后来团队规范升级,新表统一改用utf8_unicode_ci,但老表一直没做迁移。两套规则在同一套数据库里和平共处了很久,直到某天一条JOIN把它们同时拉进一个比较表达式。

3.3 第三步,information_schema全局扫描混用规则

如果库里有几十张表,不可能一张张去SHOW CREATE TABLE。直接查information_schema效率高得多。第一步先看"表内混用":

SELECT table_name, COUNT(DISTINCT collation_name) AS collation_count, GROUP_CONCAT(DISTINCT collation_name) AS collation_list FROM information_schema.columns WHERE table_schema = 'your_database_name' GROUP BY table_name HAVING collation_count > 1;

思路很简单:一张表的所有字符串字段如果排序规则一致,collation_count就是1;大于1说明表内部已经混用了。这是最需要优先处理的清单。

第二步看"跨表混用",重点检查高频JOIN字段,比如主键、外键、业务编号、状态码这类:

SELECT table_name, column_name, collation_name FROM information_schema.columns WHERE table_schema = 'your_database_name' AND column_name IN ('id', 'user_id', 'order_no', 'status') ORDER BY column_name, collation_name;

如果同一个字段名出现在多张表里,而collation_name不一致,那它们就是潜在的雷。我在实际库里跑完这条查询,发现不只是user_id,连status字段都存在三套排序规则并存的情况,说白了就是历史包袱。

3.4 第四步,别忘了连接层和库级参数

字段级查完,还要看一眼库级和连接级配置:

SELECT @@character_set_server AS charset_server, @@collation_server AS collation_server, @@character_set_database AS charset_database, @@collation_database AS collation_database, @@character_set_connection AS charset_connection, @@collation_connection AS collation_connection;

为什么这个也要查?因为连接层排序规则会影响不带表字段参与的表达式,比如存储过程里的临时比较、动态SQL拼出来的条件。JDBC连接串里的characterEncoding=utf8并不等同于指定了collation,在MySQL 5.7和8.0上的默认行为还有差异。开发环境不报错、生产环境报错的诡异现象,往往就是连接层参数不一致造成的。

4. 三种修复手段与最佳组合顺序

找到肇事字段之后,修复路径有三条。它们不是互斥的,按场景选择,组合使用效果最好。

4.1 治本方案:ALTER TABLE统一字段排序规则

如果确定两个字段在业务上必须长期关联,历史数据也能接受排序规则变化,最干净的做法是直接把字段统一:

ALTER TABLE users MODIFY COLUMN id VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '';

有几个细节必须注意:

  • 锁表风险:ALTER TABLE MODIFY COLUMN在大表上会耗时很久,务必安排在业务低峰期。可以先在测试环境用同样数据量演练一遍,估算真实耗时。
  • 字符集要一起写:修改排序规则时最好连CHARACTER SET一起显式指定,否则MySQL可能按默认行为顺手修改字符集,引起数据编码变化。
  • 索引会重建:如果字段上有索引,修改collation会触发索引重建,耗时可能翻倍。提前确认磁盘空间和IO负载。

如果想统一整张表所有字符串字段,可以用:

ALTER TABLE orders CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

这条语句会把表里所有字符串列的内容编码和默认排序规则一次性转换,比重重复MODIFY省事。但它会做全表数据重写,大表执行前必须备份,并且要确认业务侧可以接受短暂不可用。

4.2 救火方案:SQL里显式指定COLLATE

线上已经报错、业务不能停、表结构一时改不了的时候,可以在SQL里用COLLATE指定用哪个排序规则,利用EXPLICIT的优先级覆盖掉IMPLICIT冲突:

SELECT o.order_no, u.user_name, u.phone FROM orders o LEFT JOIN users u ON o.user_id = u.id COLLATE utf8_unicode_ci WHERE o.created_at >= '2024-01-01 00:00:00'

也可以显式转换字段:

JOIN users u ON o.user_id = CONVERT(u.id USING utf8) COLLATE utf8_unicode_ci

UNION场景同理,在合并字段后面加COLLATE即可:

SELECT user_id FROM old_orders UNION SELECT user_id FROM new_orders COLLATE utf8_unicode_ci

这个方案见效快,但隐患也很明显:改动散落在每条SQL里,团队里但凡有人漏加一处,错误就换个地方继续爆。所以它只适合应急,不能作为长期方案。

4.3 兜底方案:JDBC连接层统一collation

还有一个容易被忽略的层面——连接参数。MySQL JDBC连接串可以这样配置:

jdbc:mysql://127.0.0.1:3306/your_db?useUnicode=true&characterEncoding=utf8&connectionCollation=utf8_unicode_ci

加上connectionCollation参数后,本次连接会话的默认排序规则固定下来,影响不带表字段参与的表达式比较。但它有个硬限制:两个表字段JOIN时,字段自身定义的排序规则仍然优先,连接层管不到。所以方案C只能算兜底防线,不能替代方案A的根治。

4.4 怎么选:一个实际生产案例的修复顺序

用一个我处理过的案例来收束这部分。当时某系统的订单接口突然大面积报错,日志里就是这个Illegal mix of collations。我的处理顺序是:

  1. 先救火:在受影响的Mapper SQL里临时加COLLATE utf8_unicode_ci,发一版热修复包让线上先恢复。
  2. 再定位:在低峰期用information_schema扫描,列出所有排序规则不一致的表和字段,生成迁移清单。
  3. 后治本:分批执行ALTER TABLE ... CONVERT TO CHARACTER SET,按表大小从小到大,每执行完一张跑一遍相关接口回归。
  4. 最后兜底:把JDBC连接串统一加上connectionCollation,并在配置中心固化。

整套下来,当天线上恢复,一周内表结构统一完毕。之后一年里再没出现过这条异常。

方案适用场景优点缺点执行成本
A:修改字段/表排序规则长期稳定、字段固定根治问题、一次到位锁表风险、需低峰期中高
B:SQL显式COLLATE线上报错、急需恢复改动小、见效快容易遗漏、散落各处低
C:连接层统一会话级表达式、存储过程一次配置全局生效解决不了字段JOIN冲突低

5. 如何预防:让"排序规则混用"从源头消失

5.1 建表规范显式声明

最有效的预防是把标准写进建表规范。团队可以约定:新库统一使用utf8mb4字符集 +utf8mb4_unicode_ci(或MySQL 8.0默认的utf8mb4_0900_ai_ci),并且建表SQL必须显式写出DEFAULT CHARACTER SET和DEFAULT COLLATE,不允许依赖服务器全局设置:

CREATE TABLE users ( id VARCHAR(64) NOT NULL COMMENT '用户ID', user_name VARCHAR(128) NOT NULL COMMENT '用户名', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

显式写出来的好处是表定义自解释,任何人看SHOW CREATE TABLE都能明确知道规则,而不是"大概跟全局默认一样"。审核代码时也只需要扫一眼,规不规范一目了然。

5.2 自动化检查卡点

光有规范没有检查等于白写。把"排序规则体检"做成上线前的自动化检查脚本,一旦发现异常直接拦截发布:

SELECT table_schema, table_name, COUNT(DISTINCT collation_name) AS cnt FROM information_schema.columns GROUP BY table_schema, table_name HAVING cnt > 1;

执行结果非空就说明有表内部混用,自动触发告警。更进一步,可以在CI里对比当前库与基线库的collation配置差异,防止某个开发者本地建表时用了不同的默认值,把差异带上线。

5.3 字段设计的"门当户对"意识

再聊一个经验层面的建议:设计表结构时,凡是将来可能参与JOIN的字段——用户ID、订单号、商品编码、机构号、状态码——字符集和排序规则必须完全一致。这件事应该跟主键意识一样,成为数据库设计的默认肌肉记忆,而不是等到报错了再回头补救。

我在一个项目里就吃过这个亏。订单表用utf8_general_ci,用户表用utf8_unicode_ci,两个表的user_id都是VARCHAR(32),看着一模一样,一JOIN就炸。后来把核心关联字段批量统一成utf8mb4_unicode_ci,再把建表模板固化下来,才彻底消停。血泪教训:"看起来一样"不等于"MySQL认为一样"。

5.4 大版本迁移与回归测试

还有一个容易被忽视的盲区:MySQL不同大版本的默认排序规则不一样。5.7默认是utf8mb4_general_ci,8.0默认变成了utf8mb4_0900_ai_ci。如果开发环境是5.7、生产升到了8.0,dump导入或者迁移任务执行后,排序规则可能悄悄变化。跨版本迁移之前,建议先导出一份information_schema.columns的快照做前后对比,别等上线后才发现一堆字段collation已经被隐式改掉了。

修复完这类问题,我还会补一个收尾动作:在测试环境写一条覆盖"老数据+新数据"的专项回归用例,专门跑之前报错的JOIN、UNION、子查询组合,确认不只是在数据量小的表上"碰巧不报错",而是真的在所有排序规则组合下都能稳定工作。这种问题最大的特点就是隐蔽、间歇、容易复发,只有从表结构层面彻底统一,才算是真正解决。

相关新闻

从零搭建能干活的Bot:环境搭建、创建与群组集成实战

从零搭建能干活的Bot:环境搭建、创建与群组集成实战

1. 从零搭建一个能干活儿的 Bot:整体思路与方案选型很多人第一次接触 Bot 这个概念,脑子里浮现的都是那种只会回复“你好,请问有什么可以帮您”的机械应答器。但真正在团队里干过活的人都知道,一个能拉进群、能接任务、能自动处理…

2026/10/20 5:36:12 阅读更多 →
单HTML体素引擎:不依赖服务器的轻量级《我的世界》实现原理

单HTML体素引擎:不依赖服务器的轻量级《我的世界》实现原理

简介:这是一份面向前端开发者与Web游戏技术爱好者的单文件网页版《我的世界》实现方案,聚焦HTML/CSS/JS纯前端技术栈,无需服务端或插件即可在浏览器中运行完整Minecraft 1.12.2客户端。资源仅含1个核心HTML文件(压缩包大小14.96MB…

2026/10/20 5:36:12 阅读更多 →
全网刷屏的“GPT-2时刻“:π0.7发布为何让机器人圈集体致敬一个6年前的老模型

全网刷屏的“GPT-2时刻“:π0.7发布为何让机器人圈集体致敬一个6年前的老模型

全网刷屏的"GPT-2时刻":π0.7发布为何让机器人圈集体致敬一个6年前的老模型 【免费下载链接】gpt2 项目地址: https://ai.gitcode.com/hf_mirrors/openai-community/gpt2 最近机器人圈发生了一件有意思的事。 美国一家叫 Physical Intelligence&…

2026/10/20 5:36:12 阅读更多 →

最新新闻

网络八股文拆解:TCP握手与HTTPS原理实战

网络八股文拆解:TCP握手与HTTPS原理实战

1. 网络八股文:被嫌弃却绕不过去的存在“网络八股文”这个词,在技术圈子里一提起就自带话题度。有人把它贬得一文不值,觉得就是一堆死记硬背的固定问答,背下来毫无意义;也有人靠它拿下了心仪的岗位,把它奉为…

2026/10/20 6:20:30 阅读更多 →
蛋白互作研究:Pull-down与光交联质谱如何捕获瞬时、弱和膜蛋白

蛋白互作研究:Pull-down与光交联质谱如何捕获瞬时、弱和膜蛋白

干了快十年的蛋白互作实验,我一直觉得Pull-down是门“手艺活”。运气好的时候,一条清晰的目的条带能让你兴奋半天;运气不好时,非特异背景把结果糊成一片,而你想抓的目标互作——尤其是那些瞬间发生、结合很弱、还赖在膜…

2026/10/20 6:20:30 阅读更多 →
Java复杂度分析:从大O到性能优化,一篇文章搞懂

Java复杂度分析:从大O到性能优化,一篇文章搞懂

Java学习苦旅系列写到第八篇,前面聊了面向对象、集合框架、异常处理这些基础大件,这次我想聊聊一个很多人一听到就头疼、但其实完全没必要的概念——复杂度。不说虚的,这篇就是想让你看完之后,再遇到有人跟你讨论什么O(n)和O(log …

2026/10/20 6:20:30 阅读更多 →
专科生用千笔AI写作:从论文大纲到答辩的完整实操指南

专科生用千笔AI写作:从论文大纲到答辩的完整实操指南

专科生收藏!千笔AI写作,全民喜爱的AI论文网站——这个标题背后其实藏着不少误解。有人以为它是"一键生成论文"的作弊神器,也有人觉得AI写的东西全是废话,根本不靠谱。我因为帮不少专科学生看过论文、改过框架&#xff0…

2026/10/20 6:20:30 阅读更多 →
长江流域shp数据空间可视化分析:从坐标系到实战避坑

长江流域shp数据空间可视化分析:从坐标系到实战避坑

简介:这是一套面向GIS从业者、地理科研人员及高校学生的长江流域矢量数据集,以Shapefile格式提供,可直接在ArcGIS等软件中加载,用于空间可视化分析与制图。包内共44个文件,涵盖shp、shx、dbf、prj、sbn、sbx、cpg及xml…

2026/10/20 6:20:30 阅读更多 →
diagram-design实战:从草图到系统化视觉表达的设计思路与工具选型

diagram-design实战:从草图到系统化视觉表达的设计思路与工具选型

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到 diagram-design 这个词,很多人会下意识以为它只是一个画流程图的工具,或者某个设计软件的插件。但真正在项目里摸爬滚打过几年的人会明白,它指向的是一套更…

2026/10/20 6:19:30 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →