news 2026/9/11 16:04:02

MySQL 9.0安装配置实战:从零部署到常见问题排查

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 9.0安装配置实战:从零部署到常见问题排查

说实话,MySQL 9.0刚出的时候,我身边不少朋友都在观望,毕竟8.0已经稳坐江山好几年了。但随着官方发布了Innovation版本策略,9.0这个版本号一出来,就有很多人在后台问我到底能不能装、值不值得装、好不好用。我自己也花了两天时间,从拿安装包到部署、初始化、跑实际业务,完整走了一遍流程。这篇不是官方文档的复读,而是把整个过程中踩过的坑、确认过的细节、日常用得上的命令全部整理出来,给想尝鲜或者项目里正好在选型的你一个参考。

MySQL 9.0跟以前的版本不太一样,它属于官方定义里的“创新版”,意味着你能更快体验新特性,但也要接受它的迭代节奏和兼容性变化。所以这篇博文会先把版本定位讲清楚,再按顺序把安装、配置、基础使用、常见问题全部过一遍,确保小白照着做也能把服务跑起来,用过8.0的老手也能快速定位到新版本的变化点。

1. MySQL 9.0的版本定位和特性变化

1.1 为什么会出现9.0,它和8.0到底差在哪

想搞懂9.0,得先知道MySQL从2024年开始执行的版本策略。以前大家熟知的版本都是类似5.7、8.0这种大版本,一个版本维护很多年,升级节奏相对慢。现在官方把版本分成两种类型:一种是长期支持版,也叫LTS,比如8.0、8.4这些,适合生产环境稳定跑;另一种就是Innovation版本,也就是创新版,比如9.0、9.1这种,特点是功能上新快,但维护周期短,通常只持续到下一个创新版出来。

MySQL 9.0就是这么一款创新版,它和8.0核心的SQL语法、存储引擎体系、主从复制模型并没有翻天覆地的变化,但确实有一些只有新版本才有的东西。在第一次启动的时候你会发现,8.0里常见的部分旧命令和参数,在9.0里已经被调整或者删掉了。比如之前那些带mysql_native_password插件的旧认证方式,官方已经明确不推荐继续使用,默认认证全部走caching_sha2_password,这在你创建用户和配置客户端连接的时候会有直接影响。

另外9.0还引入了向量类型的初步支持。这个听起来有点抽象,你可以把它简单理解成数据库里能存一组数字数组,并且支持对这些数组做距离计算。从实际角度来看,这为将来在MySQL里做AI应用、相似度检索、推荐系统提供了一个原生基础。虽然目前使用场景还不算多,但至少说明官方在往这个方向押注。

还有一点值得注意的是,9.0版本的全文索引行为有一些变化。过去对中文字段做全文检索需要额外配置分词器,现在9.0对ngram解析器的支持更成熟了,默认情况下中文全文索引的可用性比8.0时期好不少。这点对做内容站或者带搜索功能的项目来说,是个很实用的提升。

1.2 版本差异里的兼容性提示

有人可能会问,既然和创新版一起发布的是8.4 LTS,那为什么不直接装8.4,非要折腾9.0?这要看你的需求。如果你是想在生产环境图稳,那8.4确实更合适;但如果你在做新项目选型、想试一下新特性和SQL行为变化,或者单纯就是不想落后于社区节奏,9.0其实是可以玩的。不过我要提前打个预防针:9.0不像8.0那样从头到脚给你兼容所有老配置,从8.0直接升到9.0,很多时候不能指望一键迁移,最好先在测试环境把存储过程、触发器、视图这些对象全部过一遍,确认没有用到已经被废弃的语法和参数。

我自己在测试的时候,就发现旧版本里常用的SHOW STATUS LIKE这类查询风格,在9.0里部分返回结果被拆得更细了,一些监控脚本如果不改,会拿到不太一样的数据。同时,information_schema里部分表字段也有调整,比如之前某些统计字段的单位、精度发生了变化。所以升级前真的不要只看版本号,要跑一遍兼容性测试,特别是如果你用了不少第三方工具,比如备份工具、同步工具、监控agent,这些工具本身对新版MySQL的支持程度,往往是比数据库本身更早暴露问题的地方。

2. 安装前的准备工作和软件选型

2.1 选择操作系统和发行版本

MySQL官方对主流操作系统的支持都挺到位的,Linux、Windows、macOS都能跑。但从部署角度来说,我更推荐在Linux上安装,原因很简单:生产环境几乎都是Linux,而且Linux下的启动方式、仓库配置、自动化部署手段更成熟。你要是本地开发用Windows,也没问题,毕竟官方提供了ZIP归档包和安装向导,图形化点一点也能装好。只是Windows上跑MySQL,有些文件权限、环境变量、服务管理方式跟Linux差异比较大,后面配置主从或者用Docker部署时,体验就没那么顺滑了。

在Linux发行版里,我这次专门用了一台CentOS 7兼容环境的虚拟机来测9.0的安装。之所以选这个环境,是因为很多人生产还在用这种内核相对稳定的系统,但它的glibc版本比较旧,有时候大家会担心新版MySQL编译包装不上。实测9.0的通用Linux版在CentOS 7.9这种老环境上也能正常跑,因为官方发布了针对glibc 2.17以上的二进制包,兼容性没问题。不过还是建议优先用官方仓库安装方式,省掉一堆依赖的麻烦。

2.2 下载安装包的几种常用方法

下载MySQL 9.0最稳妥的方式就是去官方网站的下载页,路径不太复杂:进入官网,点击Downloads,选择MySQL Community Server,然后选择对应的操作系统和安装包格式。官方提供了不少打包方式,作为服务器版本,Linux下常见的是RPM Bundle、RPM单个包、以及tar.gz归档包。

对新手我建议优先用RPM Bundle方式,它会一次性把你需要的服务端、客户端、公共库都打包在一起,省得一个个去装。对喜欢手动控制目录结构的老手,tar.gz归档包更灵活,解压完放到指定目录就行。我之前有一台测试机用的就是tar.gz方式,因为不想污染系统自带的包管理器依赖,目录直接放在/opt/mysql-9.0.0,管理起来很清晰。

Windows环境就更方便了,下载ZIP Archive版本,以管理员身份解压到比如C:\mysql-9.0.0目录,然后配置环境变量、初始化数据目录、安装Windows服务,三步就能跑起来。不过要注意,Windows下解压用的目录不要带中文和空格,否则后续启动服务和连接数据库很容易出现路径识别问题。

在下载页面你还会看到带debug后缀的二进制包,那个是给C++开发者调试MySQL源码用的,正常人千万别下,体积大、运行慢,完全没有必要。

2.3 免安装版到底该怎么用

热词里看到不少人在搜“MySQL免安装版教程”,这里我多说一句。所谓的免安装版,其实就是我上面提到的ZIP Archive压缩包,它不需要经过安装向导,解压即用。但“免安装”不代表你什么都不用配置,你还是得手动初始化数据目录、手动设置root密码、手动把MySQL注册成系统服务。Windows用户常见做法是解压后进到bin目录,先执行一条初始化命令,再执行注册服务命令。

我遇到过不少朋友卡在免安装版上,大多数问题都出在权限配置上。Windows下如果没调整目录权限,MySQL的数据目录可能无法正常写入,服务起来没几秒就崩。Linux下则要注意不能用root账号直接初始化数据目录,要么切换到mysql用户,要么加--user=mysql参数指定运行用户。官方包自带的mysql用户一般都会自动创建,如果系统里没有,初始化之前先手动创建用户和用户组。

3. 从零开始安装配置MySQL 9.0的完整实操

3.1 初始化环境与安装必要依赖

如果是Linux服务器,先确认系统时间、时区、网络都正常,然后更新一下基础软件源。拿CentOS系来说,通常还需要安装libaionumactl-libs这些库,因为MySQL二进制包运行时会依赖它们。缺了这些库,最典型的表现就是mysqld启动时报错,连日志都生成不出来,特别容易让人误判是安装包有问题。

安装依赖的命令大概是这样的:

yum install -y libaio numactl-libs ncurses-compat-libs

如果系统提示找不到某个包,优先检查一下软件源是不是没启用或者太旧,把源更新到最新再装。我在CentOS 7.9上就遇到numactl-libs在老源里没有的情况,绕了一下才补上。可以用ldd命令检查mysqld二进制文件的动态库依赖是否齐全,这个技巧排查启动问题非常有用。

3.2 上传安装包并解压

下载好后,把RPM Bundle或者tar.gz包上传到服务器。我习惯放在/usr/local/src,这样方便管理和清理。如果是RPM Bundle,直接解压出一个目录,里面会有多个rpm文件,只需要装server和client相关的几个就行。命令如下:

tar -xvf mysql-9.0.0-1.el7.x86_64.rpm-bundle.tar rpm -ivh mysql-community-common-9.0.0-1.el7.x86_64.rpm rpm -ivh mysql-community-client-plugins-9.0.0-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-9.0.0-1.el7.x86_64.rpm rpm -ivh mysql-community-client-9.0.0-1.el7.x86_64.rpm rpm -ivh mysql-community-server-9.0.0-1.el7.x86_64.rpm

如果你用tar.gz包,解压到目标目录后,通常还会做软链或者直接把目录名改成mysql,方便后续配置和环境变量引用。我的习惯是建一个/usr/local/mysql软链,指向具体的版本目录,这样以后升级的时候,只需要换软链指向,不用到处改路径。

3.3 数据目录初始化与首次启动

初始化是安装过程中最核心的一步。初始化命令会根据配置文件生成数据目录、系统表等基础结构,并且会生成一个临时的root密码,这个密码在日志文件里能查到。9.0里的默认配置文件路径,依然是/etc/my.cnf,如果系统里没有这个文件,可以自己创建。基础配置可以这样写:

[mysqld] basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock port=3306 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

配置里有两个点值得注意。一个是character-set-server=utf8mb4,这个建议一定加上,不然后续建表默认字符集可能还是latin1,中文存进去全是乱码。另一个是socket的路径,很多人后面遇到“ERROR 2002 (HY000): Can't connect to local MySQL server through socket”就是这个路径对不上导致的,所以配置里写清楚,后面连接就能少踩坑。

初始化数据目录,使用如下命令:

/usr/local/mysql/bin/mysqld --initialize --user=mysql

执行完之后,用下面的命令查看临时密码:

grep 'temporary password' /var/log/mysqld.log

如果日志里没有生成临时密码,可能是数据目录权限不对,或者配置文件里log-error路径没有写权限。检查一下/usr/local/mysql/data目录属主是否变成了mysql。

3.4 启动服务并完成安全加固

初始化完成后,启动MySQL服务。不同安装方式,启动命令会有点差别。RPM包安装的一般直接用systemctl管理:

systemctl start mysqld systemctl enable mysqld

tar.gz方式安装的则更喜欢手动方式启动:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

启动之后,最好等一两秒再检查端口,确认3306端口有监听:

ss -tlnp | grep 3306

登录数据库用临时密码:

mysql -uroot -p

进去以后第一步就是改root密码。如果不改密码,后续任何操作都会受限,而且9.0对空密码和弱密码的限制非常严格,初始化临时密码使用一次后,系统会强制你设置新密码。执行下面的SQL:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新强密码'; FLUSH PRIVILEGES;

改完密码后,再用一条综合安全脚本检查一下,MySQL自带一个安全加固命令:

mysql_secure_installation

这个脚本会按顺序问你要不要移除匿名用户、禁止root远程登录、移除test库等,推荐全部选择Y。如果你只是本地开发,这里甚至建议root保持只允许localhost登录,远程访问另建账号,这样安全等级高很多。

3.5 远程访问授权和防火墙放行

默认情况下MySQL的root用户只允许本地连接,如果你需要被其他机器登录,就得手动创建远程账号或者授权root远程访问。出于安全考虑,我强烈建议专门创建一个业务账号,不要直接开放root。

创建远程用户的方式如下:

CREATE USER 'app_user'@'%' IDENTIFIED BY '你的业务密码'; GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%'; FLUSH PRIVILEGES;

如果创建用户时报错,提到密码策略太弱,说明9.0默认启用了validate_password组件,要求密码同时包含大小写、数字和特殊字符,长度一般不低于8位。这是好事,不要关掉,只要把密码设复杂点就能通过。

远程访问授权完成后,还要确认服务器防火墙放行3306端口。Linux下要么直接关闭防火墙(不建议生产这么做),要么配置规则放行:

firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload

如果用的是云服务器,还要记得在安全组策略里加上3306入方向规则。这一步经常被忽略,本地死活连不上,结果发现是安全组的问题。

4. MySQL 9.0的日常使用与SQL实操

4.1 登录、用户与权限管理

安装配置完成之后,就该进入日常使用环节了。命令行连接MySQL的标准姿势是:

mysql -h127.0.0.1 -P3306 -uroot -p

这里有个小区别:如果你用-h localhost-h 127.0.0.1,MySQL解析方式会略有不同。localhost通常会走socket连接,而127.0.0.1走TCP连接,如果你socket路径配置有问题,使用localhost连接就会报错。所以排查连接问题时,可以先用IP方式试一试,能连上就说明socket有问题,要检查配置文件里的socket路径和客户端配置是否一致。

用户权限管理这块,建议了解一下MySQL的用户体系。用户由用户名@主机组成,所以'app_user'@'%''app_user'@'localhost'是两个不同的用户。查看用户列表:

SELECT user, host, plugin FROM mysql.user;

回收权限、查看权限的常用命令也顺手列一下:

SHOW GRANTS FOR 'app_user'@'%'; REVOKE DELETE ON mydb.* FROM 'app_user'@'%';

这一部分特别适合刚入门的朋友反复练习,因为权限管理是数据库安全的核心,很多事故都是权限给得太大导致的。日常开发账号足够用就行,不要一开始就ALL PRIVILEGES一把梭。

4.2 建库建表与字符集设置

建库的时候,字符集相关参数建议在创建时一次性指定,避免后续表太多再改:

CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

表结构的设计上,MySQL 9.0仍然以InnoDB引擎为默认。设计表时,主键是必须认真考虑的,建议使用自增主键或者UUID。自增主键写入性能高,但分布不均匀;UUID能保证全局唯一,但如果是字符串类型的UUID做主键,索引空间会大不少,写入时随机IO也更明显。实际项目里,我更喜欢把自增ID当作唯一主键,再根据需要给业务字段添加唯一索引。

一个基本的建表语句示范:

CREATE TABLE `user_info` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL COMMENT '用户名', `email` varchar(128) DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), KEY `idx_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这里有几个设计上的细节:updated_at字段加上ON UPDATE CURRENT_TIMESTAMP之后,每次更新数据时自动刷新时间,省去应用层处理的麻烦;email字段上建索引是因为查询场景里经常按邮箱找用户,而唯一索引用username,保证业务唯一性。

4.3 常用SQL语句与存储过程实战

日常增删改查就不再啰嗦了,这里重点讲存储过程,因为很多教程都只是简单带过,实际写起来细节很多。MySQL 9.0依然支持存储过程,写法上和8.0基本一致,但在调试、权限管理方面更规范。

比如一个简单的分页查询存储过程:

DELIMITER // CREATE PROCEDURE `sp_get_users`(IN page_num INT, IN page_size INT) BEGIN DECLARE offset_val INT; SET offset_val = (page_num - 1) * page_size; SELECT id, username, email, created_at FROM user_info ORDER BY id DESC LIMIT offset_val, page_size; END// DELIMITER ;

调用方式就很简单:

CALL sp_get_users(1, 10);

注意DELIMITER //这条命令,它是在告诉MySQL客户端,接下来的语句用//作为分隔符,而不是默认的分号。因为在存储过程内部,分号是语句结束符,如果不改分隔符,客户端会在第一个分号处就认为语句结束了,导致过程体残缺。这个细节特别容易让新手困惑。

存储过程的优点是把业务逻辑封装在数据库层,减少网络往返,但维护上也有成本。我的建议是:简单的数据操作没必要上存储过程,复杂报表或者需要事务性多次操作的场景,才值得用。

4.4 行转列案例,面试和工作都会遇到

行转列是MySQL使用中很经典的考点,也是日常报表开发里很常见的需求。简单来说,就是把表里同一分类的多行数据,变成一行里的多个列字段。举一个订单统计的例子,一张订单明细表结构大致是:

CREATE TABLE order_stat ( order_date date NOT NULL, category varchar(32) NOT NULL, amount decimal(10,2) NOT NULL );

现在希望统计每一天各品类的订单总金额,预期结果是一天一行,不同品类出现在不同列。可以用条件聚合的方式实现:

SELECT order_date, SUM(CASE WHEN category = 'electronics' THEN amount ELSE 0 END) AS electronics_amount, SUM(CASE WHEN category = 'clothing' THEN amount ELSE 0 END) AS clothing_amount, SUM(CASE WHEN category = 'books' THEN amount ELSE 0 END) AS books_amount FROM order_stat GROUP BY order_date;

这种写法不需要动态拼接SQL,性能也比较稳定,适合品类数量固定的场景。如果品类数量不固定,那就得用动态SQL拼接列名,然后在预处理语句里执行。这个会复杂不少,需要在存储过程里利用GROUP_CONCAT生成列片段,再拼成一条完整SQL去执行。工作里遇到固定分类用上面的写法就足够了,面试问到动态行转列时,你再说得出思路,基本就过关了。

4.5 索引优化与慢查询排查

索引是MySQL性能的灵魂,9.0对执行计划的分析和优化器都做了改进,但基础不走偏才是关键。建索引之前先用EXPLAIN看执行计划,这是基本习惯:

EXPLAIN SELECT * FROM user_info WHERE username = 'test';

如果type列出现ALL,说明是全表扫描,数据量大了就会慢。这时候考虑在查询条件字段上加索引。但索引也不是越多越好,每个索引都会拖慢插入和更新操作,所以只给高频查询的字段建索引才是划算的。

查看慢查询日志是定位线上性能问题的主要手段。MySQL默认慢查询日志是关闭的,可以在配置里临时打开:

slow_query_log=ON slow_query_log_file=/var/log/mysql-slow.log long_query_time=1

long_query_time设置为1,代表超过1秒的SQL会被记录。大部分业务里,超过1秒的查询都值得怀疑,先捞出来看执行计划,再决定是加索引还是改写SQL。

5. 常见问题与排查技巧

5.1 ERROR 2002:连接本地MySQL失败

搜索热词里出现了ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock',这应该是大家遇到最频繁的报错之一。出现这个错误时,第一反应要判断MySQL服务是否还在运行。用systemctl status mysqld看看进程状态,或者直接ps -ef | grep mysqld

如果进程确实存在,但socket路径对不上,那就去配置文件里校队一下。比如实际生成的socket文件在/tmp/mysql.sock,客户端却默认去/var/run/mysqld/mysqld.sock找,自然连不上。解决办法是在/etc/my.cnf[mysqld][client]段都写上同样的socket路径,重启生效。

还有一种情况是服务已经停了,可能数据目录权限变了,或者磁盘满导致启动失败。这时候要第一优先看错误日志:

tail -50 /var/log/mysqld.log

日志里一般会直接告诉你启动失败的原因,比无头瞎猜高效得多。

5.2 忘记root密码后如何找回

忘记密码也是高频问题。解决方案是跳过授权表启动,然后重新设置密码。步骤大概是:先停掉MySQL服务,然后在启动命令里加--skip-grant-tables参数启动,这样登录时不需要密码。

不过9.0里有个坑,就是即便跳过了授权表,直接UPDATE mysql.user修改root密码可能还是不行,因为认证插件和密码字段的存储方式已经调整过。更推荐的方式是登录后直接刷新权限系统,再使用ALTER USER改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;

改完之后,一定要记得删除--skip-grant-tables参数重启数据库,否则数据库处于一个“裸奔”状态,任何人都能免密登录,这是非常危险的事故源。

5.3 中文乱码的排查建议

中文乱码大多数是字符集不一致导致的,不一定是存储时就错了。排查顺序建议这样来:先用SHOW VARIABLES LIKE 'character_set%';看一下服务端字符集配置,再用SHOW CREATE TABLE 表名;看一下表字段的字符集,再看一下连接时的字符集设定。

客户端连接时,设置:

mysql --default-character-set=utf8mb4 -uroot -p

如果服务端、表、连接三方字符集不一致,就会出现写入正常、读出乱码的情况。最彻底的解决方式是把服务端默认字符集配置成utf8mb4,然后建库建表时显式加DEFAULT CHARSET=utf8mb4。已经存在的表要改也比较麻烦,需要一条转换语句:

ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

这条语句会重写表数据和索引,表数据量大的时候要注意执行时间,最好放业务低峰期操作。

5.4 连接数满和性能问题的快速处理

如果客户端报“Too many connections”,说明数据库连接数已经达到了max_connections上限。这个参数默认值通常能应付业务,但如果程序连接池配置不合理,也会一瞬间打满。临时缓解的方法是把连接数调大:

SET GLOBAL max_connections = 500;

不过这只在内存充足的情况下才有效,不能无限调大。更根本的解决办法是从应用层做连接池复用,控制并发连接数量。MySQL每个连接都会占用线程和内存资源,连接数过大后,整体性能反而会下降,所以调参只是应急,不是长久之计。

另外一个性能排查利器是SHOW PROCESSLIST,它能把当前正在执行的SQL全部列出来。如果看到大量SQL处于Waiting for table metadata lock状态,多半是表结构变更和业务查询冲突了,找个合适窗口去做DDL操作就好。

6. 实操过程中的一些心得

这套从下载到使用的流程走下来,我的总体感觉是MySQL 9.0并没有想象中那么难上手,跟8.0的部署思路基本一致,但对安全性和规范性要求更高了。比如密码策略强制开启、默认认证插件更新,这些对老手来说只是多几步确认,对新手来说反而是好事,能在起步阶段就把安全习惯养好。

从实际项目落地的角度,如果你只是学习或者搭建个人项目,9.0完全可以直接用起来,遇到问题网上能搜到的方案也很多。如果是企业生产环境正在跑重要业务,我倒不建议立刻切到创新版,毕竟新版本的迭代节奏快,运维团队需要投入更多精力去跟踪补丁和更新。这种情况下,用8.4这类LTS版本会更稳妥,但可以把9.0当作预研环境去测试新特性。

最后分享一个小技巧:无论在哪个环境装MySQL,装好之后第一件事就是做一次全量备份策略规划,哪怕只是用mysqldump定时导出逻辑备份。我个人见过太多因为数据库崩了才意识到没备份的悲剧,这个习惯从第一天就养成,后面能省太多事。把这套流程跑通一次之后,你再去接触8.0、8.4或者其他衍生分支,都会感觉很顺手,因为核心的操作逻辑和架构思维是相通的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 15:59:41

STM32F103 AB分区OTA实战:设计原理、代码实现与踩坑记录

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

作者头像 李华
网站建设 2026/9/11 15:59:27

Codex工作流实战:构建可审计、可降耗、可兜底的本地AI编码系统

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

作者头像 李华
网站建设 2026/9/11 15:58:52

降AI率工具怎么选?Passbug理工科表现最亮眼

passbug官网直达入口:https://passbug.cn/ 高校对论文AI生成内容的检测日趋严格,降AI率从可选操作变成了必经环节。市面上的工具虽多,真正能打的却少,多数要么效果差、要么操作繁琐。这篇盘点围绕降AI率这一核心需求,…

作者头像 李华
网站建设 2026/9/11 15:58:50

JetPack 5.1.2下Orin开发环境深度部署指南

1. 项目概述:为什么在Orin上部署开发环境不是“装个系统”那么简单Jetson Orin系列——无论是Orin Nano、Orin NX还是AGX Orin——早已不是实验室里的玩具,而是工业质检、边缘AI推理、机器人实时导航、车载视觉感知等真实产线场景的主力计算平台。但很多…

作者头像 李华
网站建设 2026/9/11 15:58:42

华为官网前端实战:响应式架构与性能优化深度解析

简介:这是一份面向前端初学者的华为官网仿写实战项目,聚焦HTML5结构搭建、原生CSS响应式布局与JavaScript交互功能实现,帮助学习者系统掌握网页开发全流程核心技能。资源包共200个文件,包含4个HTML页面骨架、4个JS交互脚本、29个C…

作者头像 李华