PostgreSQL与MySQL语法差异详解:从DDL到高级查询的实战对比
1. 项目概述为什么我们需要比较PostgreSQL与MySQL的语法干了这么多年后端开发数据库选型和日常操作是绕不开的坎。PostgreSQL和MySQL这两个开源关系型数据库的“顶流”几乎在每个技术选型会上都会被拿出来反复比较。性能、特性、生态……讨论很多但落到我们开发者每天都要写的SQL上两者的语法差异才是最直接影响开发效率和代码质量的“细活儿”。你可能已经习惯了在MySQL里写LIMIT 10来分页但把同样的SQL扔到PostgreSQL里可能就会报错或者你在PostgreSQL里用惯了强大的窗口函数和CTE公共表表达式回到MySQL 5.7的环境下却发现有些写法不被支持。这种“方言”上的不兼容轻则导致SQL执行失败重则可能引发隐蔽的逻辑错误尤其是在微服务架构下不同服务可能使用不同的数据库这种差异会被放大。所以今天我们不谈高深的架构对比就扎扎实实地掰扯一下PostgreSQL和MySQL在常用语法上的那些异同。我会结合自己这些年踩过的坑和总结的经验从数据定义、数据操作、查询技巧到高级特性带你过一遍那些你必须知道的细节。目标很简单让你写出的SQL更具兼容性或者至少在需要迁移或同时维护两种数据库时能心中有数快速切换。2. 核心差异全景设计哲学与语法体现在深入具体语法之前理解两者背后的设计哲学至关重要这能解释很多语法差异的根源。MySQL的设计早期更侧重于快速、易用和互联网高并发读写特别是在Web应用场景下。它的哲学有点像“开箱即用怎么快怎么来”因此在很长一段时间里它对SQL标准的遵守相对宽松提供了大量自身的扩展语法和“语法糖”比如AUTO_INCREMENT关键字。这种灵活性降低了初期使用门槛但也导致了一些非标准习惯的养成。PostgreSQL则从一开始就高举“标准合规”和“功能强大”的大旗。它严格遵循SQL标准并把自己定位为一个“对象-关系型”数据库管理系统支持复杂数据类型、自定义函数、运算符等。它的哲学更接近“提供强大而标准的工具让用户构建复杂应用”。因此它的语法通常更贴近SQL标准有时显得更严谨甚至有些“固执”。这种哲学差异直接体现在了我们日常使用的语法上。举个例子在字符串拼接上MySQL可以用CONCAT()函数也可以用||运算符取决于PIPES_AS_CONCAT模式而PostgreSQL则严格使用||作为标准字符串连接运算符。再比如对于“空值”的判断PostgreSQL对NULL的处理更严格地遵循三值逻辑而MySQL在某些旧版本或特定模式下可能会有出人意料的行为。3. 数据定义语言DDL的语法较量DDL是我们创建和修改数据库结构的语言这里面的差异直接关系到表设计。3.1 自增主键AUTO_INCREMENT vs SERIAL/IDENTITY这是最经典的差异点之一。在MySQL中你通常这样定义自增主键CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50), PRIMARY KEY (id) );AUTO_INCREMENT是MySQL的专属关键字清晰直白。在PostgreSQL中则有几种方式体现了其演进和标准的遵循传统方式SERIAL这是一种“语法糖”并非真正的数据类型。它实际上会创建一个INT列并自动关联一个序列SEQUENCE。CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) );SERIAL对应INTEGERBIGSERIAL对应BIGINTSMALLSERIAL对应SMALLINT。这种方式简单但将序列与表绑定迁移时稍显麻烦。标准方式IDENTITY从PostgreSQL 10开始引入了更符合SQL标准的GENERATED ... AS IDENTITY语法。CREATE TABLE users ( id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, username VARCHAR(50) );这种方式明确使用了独立的序列并且在语义上更标准。GENERATED ALWAYS意味着该值总是由数据库生成如果尝试手动插入会报错除非使用OVERRIDING SYSTEM VALUE。你也可以使用GENERATED BY DEFAULT允许手动指定值。实操心得对于新项目尤其在PostgreSQL 10环境中我推荐使用IDENTITY语法它更标准未来兼容性更好。如果是维护旧项目或需要与大量MySQL知识库对齐使用SERIAL也无妨但心里要明白它的本质。3.2 模式Schema与数据库Database的概念这是一个容易混淆的点。在MySQL中“数据库”DATABASE和“模式”SCHEMA这两个词基本是同义词CREATE DATABASE和CREATE SCHEMA命令效果几乎一样。你可以把MySQL的一个DATABASE理解为一个命名空间里面包含表、视图等对象。而在PostgreSQL中概念层级更加清晰集群Cluster一个PostgreSQL服务实例。数据库Database集群内的一个独立数据单元数据库之间默认完全隔离不能跨数据库直接查询。模式Schema数据库内部的一个命名空间用于组织表、视图、函数等对象。一个数据库可以有多个模式如publichrfinance默认搜索路径是$user, public。这意味着在PostgreSQL中完整的对象引用是database.schema.table。这种设计有利于在单个数据库实例内为不同应用或部门创建逻辑隔离的空间比MySQL的“一库一应用”模式更灵活。创建表时的引用MySQL:CREATE TABLE mydb.mytable (...)mydb是数据库名PostgreSQL:CREATE TABLE myschema.mytable (...)myschema是模式名如果省略则使用search_path中的第一个模式通常是public3.3 注释语法两者语法一致都是使用COMMENT ON语句这是一个遵循SQL标准的地方。-- 为表添加注释 COMMENT ON TABLE users IS 用户信息表; -- 为列添加注释 COMMENT ON COLUMN users.username IS 用户名唯一标识;4. 数据操作语言DML与查询的细节差异这是我们打交道最频繁的部分差异点虽小但影响巨大。4.1 分页查询LIMIT/OFFSET 语法分页是Web应用的核心操作两者语法有显著不同。MySQL使用专有的LIMIT和OFFSET子句并且OFFSET在LIMIT之后-- MySQL获取第11到20条记录跳过前10条取10条 SELECT * FROM products ORDER BY created_at DESC LIMIT 10 OFFSET 10; -- 简写形式LIMIT 偏移量, 数量 SELECT * FROM products ORDER BY created_at DESC LIMIT 10, 10;PostgreSQL同样支持LIMIT和OFFSET但其语法更严格地遵循标准OFFSET子句在LIMIT之前或之后都可以但通常之后。它不支持MySQL的LIMIT offset, count简写。-- PostgreSQL SELECT * FROM products ORDER BY created_at DESC LIMIT 10 OFFSET 10; -- 或者 SELECT * FROM products ORDER BY created_at DESC OFFSET 10 LIMIT 10;注意事项这是SQL从MySQL迁移到PostgreSQL时最高频的语法错误来源之一。务必把项目中所有LIMIT offset, count的写法改成LIMIT count OFFSET offset。另外在大数据量下使用OFFSET分页性能会线性下降两者都存在这个问题应考虑使用“游标”或“基于键值”的分页方式。4.2 字符串拼接与函数字符串拼接MySQLCONCAT(str1, str2, ...)函数。如果启用ANSI模式或设置PIPES_AS_CONCAT1||也可用作拼接符。PostgreSQL使用标准运算符||。CONCAT()函数也存在但它更常用于处理NULL值——CONCAT在遇到NULL时将其视为空字符串处理而||在遇到NULL时直接返回NULL。-- PostgreSQL SELECT Hello || NULL || World; -- 返回 NULL SELECT CONCAT(Hello, NULL, World); -- 返回 HelloWorld字符串转义 在LIKE或正则表达式中转义默认字符不同。MySQL默认转义字符是反斜杠\。PostgreSQL也使用反斜杠\但请注意在标准字符串常量中反斜杠本身需要转义或者使用E前缀扩展字符串来识别转义符。更推荐使用ESCAPE子句自定义转义符。-- PostgreSQL查找包含百分号的名字 SELECT * FROM items WHERE name LIKE %\%%; -- 可能报错取决于standard_conforming_strings设置 SELECT * FROM items WHERE name LIKE %#%% ESCAPE #; -- 更安全可靠4.3 日期与时间处理日期函数是另一个“重灾区”。获取当前时间MySQLNOW()、CURDATE()、CURTIME()、SYSDATE()。PostgreSQLCURRENT_TIMESTAMP、CURRENT_DATE、CURRENT_TIME。NOW()在PostgreSQL中也有是CURRENT_TIMESTAMP的同义词。时间计算MySQL使用DATE_ADD()、DATE_SUB()函数或INTERVAL关键字。SELECT NOW() INTERVAL 1 DAY; SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR);PostgreSQL直接支持INTERVAL类型的算术运算非常直观。SELECT CURRENT_TIMESTAMP INTERVAL 1 day; SELECT CURRENT_TIMESTAMP - INTERVAL 2 hours 30 minutes;PostgreSQL的INTERVAL表示法更灵活支持像1 day 2 hours这样的复杂表达式。日期格式化MySQLDATE_FORMAT(date, format)和STR_TO_DATE(str, format)。SELECT DATE_FORMAT(NOW(), %Y-%m-%d %H:%i:%s);PostgreSQLTO_CHAR(timestamp, format)和TO_TIMESTAMP(str, format)。SELECT TO_CHAR(NOW(), YYYY-MM-DD HH24:MI:SS);格式符完全不同需要重新记忆。PostgreSQL的格式符更接近Oracle。4.4 类型转换隐式类型转换的规则不同容易导致意料之外的结果。MySQL以“宽容”著称会尝试进行大量的隐式转换。例如将字符串与数字比较MySQL会尝试将字符串转换为数字。-- MySQL SELECT 10 9; -- 返回 1 (TRUE)因为10被转为数字10 SELECT abc 0; -- 返回 1 (TRUE)因为abc转数字失败被转为0这种行为虽然方便但可能掩盖数据质量问题导致索引失效因为类型转换会使索引无法使用。PostgreSQL则非常严格通常拒绝隐式转换要求显式使用CAST或::运算符。-- PostgreSQL SELECT 10 9; -- 错误操作符不存在text integer SELECT CAST(10 AS INTEGER) 9; -- 正确返回 true SELECT 10::INTEGER 9; -- 正确::是PostgreSQL特有的快捷转换符这种严格性迫使开发者写出更精确的SQL有利于性能索引可用和正确性。5. 高级查询与特性支持度对比随着业务复杂化我们会用到更多高级SQL功能这里两者的差距开始拉大。5.1 公共表表达式CTE与递归查询CTEWITH子句能将复杂查询分解成临时命名的结果集极大提升可读性。两者都支持普通CTE语法基本一致-- PostgreSQL MySQL (8.0) WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ) SELECT region, total_sales FROM regional_sales WHERE total_sales 1000;但在递归CTE上PostgreSQL的支持更成熟和强大。递归CTE常用于处理树形或图状数据如组织架构、评论树。PostgreSQL很早就支持递归CTE语法稳定。WITH RECURSIVE category_path AS ( SELECT id, name, parent_id, name AS path FROM categories WHERE parent_id IS NULL -- 锚点找出根节点 UNION ALL SELECT c.id, c.name, c.parent_id, cp.path || || c.name FROM categories c INNER JOIN category_path cp ON c.parent_id cp.id -- 递归部分 ) SELECT * FROM category_path;MySQL从8.0版本开始才支持递归CTE。如果你还在使用5.7或更早版本则需要用存储过程或复杂的自连接来模拟非常不便。5.2 窗口函数窗口函数是进行复杂分析报表的利器可以在不聚合数据的情况下对行组进行计算如排名、移动平均。PostgreSQL对窗口函数的支持堪称典范从很老的版本8.4就开始提供完整支持功能全面。SELECT department_id, employee_name, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) as dept_rank, AVG(salary) OVER (PARTITION BY department_id) as dept_avg_salary FROM employees;MySQL在8.0版本才引入了窗口函数。这意味着如果你的生产环境是MySQL 5.7则完全无法使用这一强大特性必须用效率低下的子查询或自连接来模拟代码复杂且性能差。5.3 UPSERT插入或更新“如果存在则更新否则插入”是一个常见需求。MySQL使用ON DUPLICATE KEY UPDATE语法它依赖于主键或唯一索引冲突。INSERT INTO users (id, username, email) VALUES (1, alice, aliceexample.com) ON DUPLICATE KEY UPDATE email VALUES(email), updated_at NOW();PostgreSQL则使用更强大、更标准的INSERT ... ON CONFLICT ... DO UPDATE语法又称UPSERT从9.5版本引入。INSERT INTO users (id, username, email) VALUES (1, alice, aliceexample.com) ON CONFLICT (id) -- 指定冲突的目标必须是唯一约束 DO UPDATE SET email EXCLUDED.email, updated_at NOW();这里EXCLUDED是一个特殊的虚拟表包含了本次插入但因冲突失败的数据。PostgreSQL的语法更清晰可以明确指定是哪个唯一约束发生了冲突并且可以执行DO NOTHING冲突时忽略等操作。5.4 全文搜索两者都支持全文搜索但实现方式和能力不同。MySQL提供了MATCH ... AGAINST语法使用FULLTEXT索引配置相对简单适合基础的全文搜索需求。ALTER TABLE articles ADD FULLTEXT INDEX idx_ft (title, body); SELECT * FROM articles WHERE MATCH(title, body) AGAINST(database tutorial IN NATURAL LANGUAGE MODE);PostgreSQL的全文搜索功能则强大得多它基于一个高度可配置的文本搜索引擎。你需要先使用to_tsvector函数将文本转换为“词位”lexemes向量使用to_tsquery函数构建查询然后通过操作符进行匹配。它支持多语言、词干提取、权重分配、排名等高级功能。-- 创建GIN索引加速搜索 CREATE INDEX idx_fts ON articles USING GIN(to_tsvector(english, title || || body)); SELECT title, ts_rank_cd(to_tsvector(english, title || || body), query) AS rank FROM articles, to_tsquery(english, database tutorial) query WHERE to_tsvector(english, title || || body) query ORDER BY rank DESC;PostgreSQL的方案更灵活、更强大但学习和配置成本也更高。6. 数据类型与约束的细微之别6.1 布尔类型PostgreSQL有真正的BOOLEAN类型取值TRUE、FALSE或NULL。在查询中可以直接使用。SELECT * FROM tasks WHERE is_completed TRUE;MySQL没有内置的布尔类型。它用TINYINT(1)来模拟TRUE和FALSE分别是1和0的别名。虽然你可以在SQL语句中写WHERE is_completed TRUE但底层存储的仍是数字。6.2 数组与JSON类型这是PostgreSQL的杀手锏之一。PostgreSQL原生支持数组类型和JSON/JSONB类型。JSONB是二进制格式的JSON支持索引查询性能极佳。CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT, tags TEXT[], -- 文本数组 attributes JSONB -- JSONB字段 ); INSERT INTO products (name, tags, attributes) VALUES ( T-Shirt, {clothing, cotton, summer}, {color: red, size: [S, M, L]} ); -- 查询包含特定标签的产品 SELECT * FROM products WHERE tags ARRAY[cotton]; -- 查询JSONB字段中的属性 SELECT * FROM products WHERE attributes {color: red};MySQL从5.7版本开始支持JSON数据类型也提供了丰富的JSON函数。但它不支持原生的数组类型。MySQL的JSON功能虽然发展很快但在操作符的丰富性和与SQL的集成度上仍稍逊于PostgreSQL。6.3 外键约束行为在定义外键约束时ON DELETE和ON UPDATE子句是两者都支持的。但有一个细微差别约束检查的时机。在MySQL使用InnoDB存储引擎时外键约束检查通常是即时的。但在某些复杂的多语句事务中如果使用SET FOREIGN_KEY_CHECKS0临时禁用检查需要特别注意否则可能导致数据不一致。PostgreSQL的外键约束行为非常严格且一致总是在事务结束时进行检查。这符合SQL标准能确保事务内的数据完整性。你无法临时禁用PostgreSQL中的外键约束这强制你设计出更严谨的数据操作逻辑。7. 常见问题与迁移避坑指南在实际开发和迁移过程中以下问题最为常见。7.1 大小写敏感性问题这是一个巨大的行为差异源于底层操作系统的文件系统。MySQL在Linux下表名和数据库名是大小写敏感的这取决于你底层文件系统如ext4。变量lower_case_table_names控制此行为0-敏感1-存储为小写比较时小写2-存储原样比较时小写。默认配置容易导致“表不存在”的错误。PostgreSQL表名、列名等标识符默认是大小写不敏感的但会被强制转换为小写除非你用双引号引起来。CREATE TABLE MyTable实际创建的表名是mytable。而CREATE TABLE MyTable创建的表名才是MyTable。查询时SELECT * FROM MyTable和SELECT * FROM mytable都指向mytable但SELECT * FROM MyTable才指向MyTable。踩坑实录从MySQL迁移到PostgreSQL时如果MySQL中原有表名包含大写字母并且SQL语句中没有用反引号保护那么迁移到PostgreSQL后这些表名会被全部转为小写。如果应用程序的SQL语句中依然混用大小写就会导致“relation \MyTable\ does not exist”错误。**最佳实践是在两种数据库中都坚持使用小写字母加下划线的命名规范如user_account并一以贯之。**7.2 默认值与非空约束在处理NULL和默认值时行为有细微差别。在MySQL中如果你向一个声明为NOT NULL且没有默认值的列插入NULL结果取决于SQL模式sql_mode。如果sql_mode包含STRICT_TRANS_TABLES推荐则会报错否则MySQL可能会根据列类型插入一个隐式默认值如数字类型的0字符串类型的空串并产生一个警告。这种行为可能掩盖数据问题。在PostgreSQL中行为非常严格向NOT NULL且无默认值的列插入NULL或插入语句中完全省略该列都会直接导致错误。这迫使开发者必须显式处理数据完整性。7.3 隐式提交与事务MySQL的某些DDL语句如ALTER TABLECREATE INDEX在某些存储引擎如MyISAM 在旧版本中或特定情况下会导致隐式提交。这意味着即使你用一个BEGIN或START TRANSACTION开启了一个事务执行这些DDL语句后之前的所有操作都会被立即提交你无法回滚。PostgreSQL几乎所有的DDL操作都是事务性的。你可以在一个事务块内创建表、修改列、建立索引然后根据业务逻辑选择提交或回滚。这是一个巨大的优势特别在进行复杂的、需要原子性的数据库模式变更时。7.4 存储过程与函数两者都支持存储过程和函数但语法和能力差异很大几乎可以视为两种不同的语言。MySQL使用自己的CREATE PROCEDURE/CREATE FUNCTION语法语言类似于SQL/PSM标准但有很多自身扩展。PostgreSQL的函数使用CREATE FUNCTION功能极其强大它可以用多种语言编写包括内置的PL/pgSQL类似Oracle的PL/SQL、Python、Perl、JavaScript通过扩展等。PL/pgSQL的功能非常丰富支持复杂的控制结构、异常处理等。由于语法差异巨大迁移存储逻辑通常意味着重写而不是简单的转换。8. 性能相关语法与优化器提示最后聊聊直接影响性能的语法点。8.1 执行计划分析查看SQL执行计划是优化的第一步。MySQL使用EXPLAIN或EXPLAIN FORMATJSON。EXPLAIN SELECT * FROM users WHERE age 30;PostgreSQL也使用EXPLAIN但输出格式和内容更详细。EXPLAIN ANALYZE会实际执行语句并给出真实耗时非常有用。EXPLAIN ANALYZE SELECT * FROM users WHERE age 30;两者的输出解读需要分别学习成本模型、关键词如MySQL的type、key PostgreSQL的Seq Scan、Index Scan、Bitmap Heap Scan各不相同。8.2 索引提示有时我们需要干预优化器的选择。MySQL支持使用USE INDEX、FORCE INDEX、IGNORE INDEX等提示直接告诉优化器使用或不使用哪个索引。这在优化器选错索引时是最后的“杀手锏”但需谨慎使用。SELECT * FROM users USE INDEX (idx_email) WHERE email LIKE a%;PostgreSQL没有直接的索引提示语法。PostgreSQL社区认为优化器应该足够聪明提供提示是一种妥协。如果你认为优化器选错了索引通常需要通过调整random_page_cost、effective_cache_size等成本参数或者使用SET enable_seqscan off;谨慎来临时禁用全表扫描引导优化器选择索引。更根本的方法是更新表统计信息ANALYZE table_name或重新审视查询条件和索引设计。8.3 连接JOIN语法两者都支持标准的INNER JOIN、LEFT JOIN等语法。但MySQL对旧式的逗号分隔连接如FROM a, b WHERE a.idb.aid有更好的容忍度而在PostgreSQL中虽然也支持但更鼓励使用显式的JOIN ... ON语法因为更清晰且在处理复杂外连接时不易出错。我个人在实际操作中的体会是语法差异就像两种方言初听别扭但习惯后各有其妙。对于长期在单一生态的开发者深入掌握所用数据库的特性比死记硬背差异更重要。但在跨数据库项目、技术选型或面试准备时系统性地了解这些差异点能让你避免很多低级错误写出更健壮、更高效的SQL。最好的学习方式就是在本地同时安装PostgreSQL和MySQL针对每一条差异亲手写一遍SQL看看结果有何不同印象会深刻得多。毕竟数据库的世界终究是“实践出真知”。

相关新闻

C++模板与泛型编程:从习题解析到实战应用

C++模板与泛型编程:从习题解析到实战应用

1. 项目概述:从习题解答到深度掌握拿到《C Primer》第16章“模板与泛型编程”的习题集,很多人的第一反应可能是“找答案,对一下”。但如果你真这么做了,那可能就错过了这一章最核心的价值。这一章,可以说是从“会写C”…

2026/8/23 6:38:31 阅读更多 →
多智能体动态权重分配:基于市场状态与夏普利值的LLM协同决策框架

多智能体动态权重分配:基于市场状态与夏普利值的LLM协同决策框架

1. 项目概述:当多智能体决策遇上市场“议会”最近在折腾一个挺有意思的项目,名字有点长,叫“Market Regime Council for Dynamic Credit Assignment in Multi-Agent LLM Decision Systems”。简单来说,就是给一群由大语言模型驱动…

2026/8/23 6:38:31 阅读更多 →
双卡部署Qwen3.8-27B:llama.cpp实战指南与性能实测

双卡部署Qwen3.8-27B:llama.cpp实战指南与性能实测

1. 先搞清楚双卡部署Qwen3.8-27B到底要解决什么问题如果你手头有两张消费级或专业级显卡,想本地跑一个像Qwen3.8-27B这样的大模型,最直接的问题就是:怎么把模型拆开,让两张卡一起干活?以及,不同的双卡组合&…

2026/8/23 6:38:31 阅读更多 →

最新新闻

本地部署开源大模型:从硬件选型到实战配置全攻略

本地部署开源大模型:从硬件选型到实战配置全攻略

1. 项目概述:为什么本地部署大模型需要一份硬件配置攻略?最近和几个做量化交易的朋友聊天,他们都在琢磨一件事:能不能把那些动辄几百亿参数的“开源 股票 期货 量化大模型”搬到自己的机器上跑?一方面是为了数据隐私和…

2026/8/23 10:05:03 阅读更多 →
从零搭建QQ云崽机器人:Linux服务器部署与插件开发指南

从零搭建QQ云崽机器人:Linux服务器部署与插件开发指南

在实际项目开发或运维过程中,我们经常需要将一些自动化、信息查询或娱乐功能集成到即时通讯工具中,QQ机器人就是其中一种常见的实现方式。云崽机器人(Yunzai-Bot)是一个基于 Node.js 开发的、可扩展的 QQ 机器人框架,它…

2026/8/23 10:05:03 阅读更多 →
空中加油问题:从数学建模到组合优化算法的实战解析

空中加油问题:从数学建模到组合优化算法的实战解析

1. 项目概述:从一道赛题到一类经典优化问题的实战拆解 “空中加油”这个题目,乍一看像是军事或航空领域的专业问题,但对于参加过“华为杯”研究生数学建模竞赛的老兵来说,这绝对是一道让人印象深刻的经典赛题。它远不止是计算几架…

2026/8/23 10:05:03 阅读更多 →
RAG技术解析:从原理到面试全攻略

RAG技术解析:从原理到面试全攻略

1. 项目概述 RAG(Retrieval-Augmented Generation)技术是当前大模型应用领域最热门的方向之一。作为一名长期跟踪AI技术发展的从业者,我发现无论是刚入行的新人还是资深开发者,掌握RAG技术都已成为职业发展的关键技能。特别是在求…

2026/8/23 10:05:03 阅读更多 →
Spine动画AVATAR换装系统性能优化:单骨架动态附件架构实践

Spine动画AVATAR换装系统性能优化:单骨架动态附件架构实践

1. 项目概述:当AVATAR换装遇见Spine动画在游戏和互动应用开发里,AVATAR(虚拟形象)换装系统一直是个既让人兴奋又让人头疼的活儿。兴奋在于,它能极大地提升用户个性化体验和留存;头疼在于,当换装…

2026/8/23 10:05:03 阅读更多 →
dTree 入门指南:3 步画出支持多个父节点的数据树(家谱 / 组织关系)

dTree 入门指南:3 步画出支持多个父节点的数据树(家谱 / 组织关系)

dTree 入门指南:3 步画出支持多个父节点的数据树(家谱 / 组织关系) 【免费下载链接】dTree A library for visualizing data trees with multiple parents, such as family trees. Built on top of D3. 项目地址: https://gitcode.com/gh_m…

2026/8/23 10:04:03 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →