SQL JOIN 如何让 NULL 值参与关联

SQL JOIN 默认不会把两边都是 NULL 的记录关联起来,因为 `NULL = NULL` 的结果是 `UNKNOWN`,而 JOIN 条件只接受 `TRUE`。本文从 SQL 三值逻辑讲清原因,再给出通用写法、数据库专用语法和应避免的替代方案。 在写 SQL JOIN 时,最容易让人误判的一类问题,就是两边字段明明都为 NULL ,结果却没有关联成功。

SQL JOIN 如何让 NULL 值参与关联

如何使用 Entity Framework 防止 SQL 注入

Entity Framework 并不等于“天然免疫 SQL 注入”。LINQ 的 `Where` 查询通常会自动参数化,但一旦写到 `FromSqlRaw`、`ExecuteSqlRaw`,或把表名、字段名、排序条件交给用户输入,风险就会立刻出现。本文按“值参数化”和“结构白名单”两条线,梳理 EF 中真正有效的防注入做法。

如何使用 Entity Framework 防止 SQL 注入

C++ 程序在 Linux 下的性能瓶颈在哪?一文理清排查重点

Linux 下的 C++ 程序变慢,通常不是单一原因,而是 CPU、内存、I/O、锁竞争、系统调用以及编译优化共同作用的结果。本文按常见瓶颈拆解现象与处理思路,并补上 perf、valgrind、iostat 等定位工具的使用场景,帮助你先判断问题落在哪一层,再决定该改代码、调参数还是换硬件。

C++ 程序在 Linux 下的性能瓶颈在哪?一文理清排查重点

C++ 与 Linux 命令行如何交互:system() 和 popen() 的用法与选择

在 C++ 中调用 Linux 命令行,常见做法主要是 `system()` 和 `popen()`。前者适合快速执行一次性命令,后者更适合读取输出、做结果处理。本文按使用场景拆开说明两种方式的差异、限制与选择依据。 在 Linux 环境写 C++ 时,调用命令行工具是很常见的需求,但“能执行”与“能拿回结果继续处理”其实是两件事。

C++ 与 Linux 命令行如何交互:system() 和 popen() 的用法与选择

C# 环境搭建与配置:.NET SDK 安装、Visual Studio 设置与首个项目创建

这篇文章梳理 C# 开发环境的最小搭建路径:先安装 .NET SDK,再根据需求补上 Visual Studio。文中按 Windows、macOS、Ubuntu 三类系统给出验证方法,并说明创建第一个控制台项目时需要注意的关键选项。 想开始写 C#,环境准备通常会卡在两个问题上:先装什么,装完后又该怎么判断是否真的能用。

C# 环境搭建与配置:.NET SDK 安装、Visual Studio 设置与首个项目创建

gdb 调试 C++ 多线程时,如何跳过指定函数调用

在 GDB 调试 C++ 多线程程序时,很多人会以为 `next` 可以像单线程那样跳过函数调用,但 `std::thread` 启动线程后,子线程会立即并发运行,这条路行不通。本文把“跳过线程函数”拆成断点控制、函数退出和线程调度三件事,说明哪些做法有效,哪些只是表面绕开。

gdb 调试 C++ 多线程时,如何跳过指定函数调用

Debian 下 C++ 库怎么管更省事?6 种常见方案的适用边界

在 Debian 上管理 C++ 库,关键不在“会不会装”,而在不同场景下选对工具。APT 适合系统级依赖,CMake负责项目接线,vcpkg 和 Conan 更适合补足第三方和跨平台需求,手动编译与 Docker 则用于特殊版本和环境隔离。 在 Debian 里管理 C++ 库,真正麻烦的往往不是安装命令本身,而是系统包、项目依赖、特殊版本和环境复现该分别交给谁处理。

Debian 下 C++ 库怎么管更省事?6 种常见方案的适用边界

如何使用 SQL 窗口函数计算累计总额?

SQL 里做累计总额,关键不是把数据分组求和,而是在保留原始行数的前提下,按稳定顺序逐行累加。本文用窗口函数 `SUM() OVER()` 说明基础写法,并补出排序不稳定与大表性能这两个最容易踩坑的判断点。

如何使用 SQL 窗口函数计算累计总额?

Ubuntu 上怎样高效搭建 Rust 开发环境

这篇文章整理了一套在 Ubuntu 上快速搭建 Rust 开发环境的实用流程,涵盖系统依赖安装、用 rustup 安装工具链、版本验证、国内镜像加速,以及通过 Hello World 项目确认环境是否真正可用。 在 Ubuntu 上配置 Rust,难点通常不在“怎么装”,而在“怎样少走弯路,一次装对”。

Ubuntu 上怎样高效搭建 Rust 开发环境