SQL 子查询中 DISTINCT 为什么仍有重复数据

很多 SQL 查询里,子查询明明加了 DISTINCT,结果外层一 JOIN 还是出现重复,看起来像“去重失效”。问题通常不在 DISTINCT 本身,而在 JOIN 路径、字段组合唯一性、隐藏差异值,以及 GROUP BY、窗口函数、ORDER BY 等语义冲突上。 在 SQL 排查里, DISTINCT 经常被拿来压重复,但子查询一旦参与 JOIN、排序或分组,结果就可能和预期完全相反。

SQL 子查询中 DISTINCT 为什么仍有重复数据

C++ 时区转换别再手动加减小时:用 C++20 正确处理 zoned_time

在 C++20 里做时区转换,关键不是“加减几个小时”,而是把时间统一落到 `sys_time` 这个 UTC 时间点上,再交给 `std::chrono::zoned_time` 负责显示和换算。本文整理了编译链接、时区名格式、构造方式和异常处理几个最容易踩坑的点。

C++ 时区转换别再手动加减小时:用 C++20 正确处理 zoned_time

为什么 MyBatis 的 `${}` 会导致 SQL 注入

MyBatis 里的 `${}` 之所以危险,不在于语法本身少见,而在于它会把变量原样拼进 SQL,直接绕开 JDBC 预编译。本文从执行机制、典型注入方式和高危使用场景三部分说明问题,并给出项目里可落地的排查与约束思路。

为什么 MyBatis 的 `${}` 会导致 SQL 注入

SQL 如何在一次查询中统计多个业务指标

在一条 SQL 里同时统计多个业务指标,难点通常不在语法,而在指标语义是否彼此兼容。本文把几种常见写法拆开说明:什么时候该分子查询做去重统计,什么时候适合用 CASE WHEN、UNION ALL 或窗口函数,并点出 NULL、保留字和版本兼容这些容易踩坑的细节。

SQL 如何在一次查询中统计多个业务指标

C++ 如何去掉字符串中所有的多余分隔符

在 C++ 里清理字符串中的连续空格、逗号或下划线,关键不在“替换某个字符”,而在“压缩一段分隔符”。这篇文章把 `std::regex_replace`、双指针原地处理和 `std::stringstream` 拆分重组放到同一张图里比较,并说明为什么 `replace_all` 一类第三方接口并不适合这个需求。

C++ 如何去掉字符串中所有的多余分隔符

Python ctypes 里把字符串传给 C 函数,正确做法是什么

在 Python 里用 ctypes 调 C 共享库时,`char *` 参数最常见的坑就是把 `str` 直接传进去,结果触发 `ArgumentError: wrong type`。这篇文章把 `c_char_p`、`bytes`、编码方式以及 `c_wchar_p` 的适用场景拆开说明,帮你快速判断该传什么、什么时候该换类型。 用 Python 的 ctypes 调 C 共享库时,字符串参数经常在看似最简单的地方翻车:C 端写的是 char * ,Python 端却直接传了 str 。

Python ctypes 里把字符串传给 C 函数,正确做法是什么

C++ 如何用 string::erase 正确删除指定子串

`std::string::erase` 不能直接按“子串内容”删除,实际用法一定是先 `find` 定位,再用 `erase(pos, len)` 擦除。本文把删一个、删全部、处理重叠匹配和 `replace` 替代方案分开讲清,顺手避开 `npos`、单参数 `erase` 和索引更新这几个最常见的坑。 很多 C++ 初学者会把 `string::erase` 当成“按内容删除子串”的现成工具,结果不是编译不过,就是在 `npos`、单参数重载和循环删除上踩坑。

C++ 如何用 string::erase 正确删除指定子串