Firebird Null Guide: NULL behaviour and pitfalls in Firebird SQL
479.63 KB
69 页
0 下载
175 浏览
0 评论
0 收藏
所属分类:
数据库 / Firebird
| 语言 | 格式 | 评分 |
|---|---|---|
英语 | .pdf | 3 |
| 摘要 | ||
文档详细阐述了Firebird SQL中NULL的行为和常见问题。NULL表示未知值,不是空值或零值。在运算中,NULL会传播到整个表达式,导致结果为NULL。在排序时,Firebird 2及以上版本中NULL被视为最小值,可配置为排在首位或末位。文档还讨论了NULL在谓词、聚合函数、主键和外键中的处理方式,以及与用户定义函数(UDFs)的交互。此外,文档指出了不同Firebird版本中NULL的处理差异和相关bug。 | ||
| AI总结 | ||
### Firebird NULL 行为指南总结
#### 1. **NULL 的定义**
- **NULL 表示未知**:在 SQL 中,NULL 不是一个具体的值,而是表示某个字段的值未知或不存在。
- **默认状态**:任何未初始化的字段、变量或新插入记录中未提供的字段,默认为 NULL。
- **特殊情况**:NULL 不是空字符串、零或空白值,也不等于这些值。
#### 2. **NULL 在操作中的表现**
- **传染性**:将 NULL 用于数值、字符串或日期时间操作时,结果总是 NULL。
- **布尔运算**:
- `NULL OR TRUE` 结果为 TRUE。
- `NULL AND FALSE` 结果为 FALSE。
- **比较运算**:任何涉及 NULL 的比较(如 `=`、`<>`)都会返回 NULL。
- **聚合函数**:大多数聚合函数(如 `SUM`、`AVG`)忽略 NULL,但 `COUNT(*)` 包括 NULL。
#### 3. **NULL 在排序中的表现**
- **Firebird 1.0**:NULL 总是排在末尾。
- **Firebird 1.5**:支持 `NULLS FIRST` 或 `NULLS LAST`,但默认仍排在末尾。
- **Firebird 2.0 及以上**:NULL 视为“最小值”,默认排在升序的最前或降序的最后。可以通过 `NULLS FIRST` 或 `NULLS LAST` 覆盖默认行为。
#### 4. **NULL 的测试与处理**
- **测试 NULL**:使用 `IS NULL` 或 `IS NOT NULL` 来测试表达式是否为 NULL。
- **避免 NULL**:在字段或域定义中使用 `NOT NULL` 禁止 NULL 值。
- **特殊情况**:在 `CASE` 语句、`IF` 语句和 `WHILE` 循环中,如果表达式为 NULL,行为取决于具体语句。
#### 5. **用户定义函数(UDF)中的 NULL 问题**
- **意外转换**:部分 UDF 可能会将 NULL 转换为空值(如空字符串或 0),或反之。
- **新方法**:Firebird 2.0 引入了新的 UDF 调用方式,支持 NULL 传递。
#### 6. **NULL 相关的注意事项**
- **历史问题**:早期版本存在与 NULL 相关的严重 bug(如排序、`EXTRACT` 函数等),部分已修复。
- **NOT NULL 列**:向已填充表中添加 NOT NULL 列时,新列默认为 NULL,除非指定默认值或触发器赋值。
- **备份还原**:使用 Firebird 2.0 的 `gbak` 工具备份和还原时,NOT NULL 列中的 NULL 值会被正确处理。
#### 7. **总结**
- **NULL 的核心**:表示未知,具有传染性。
- **处理原则**:
- 明确测试 NULL 使用 `IS NULL`。
- 使用 `COALESCE` 或 `NVL` 将 NULL 转换为具体值。
- 注意排序中的 NULL 处理。
- **版本差异**:不同版本对 NULL 的处理存在差异,需根据具体版本调整行为。
通过理解 NULL 的行为和潜在问题,可以更安全地在 Firebird SQL 中处理涉及 NULL 的表达式和查询。 | ||
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余
62 页请下载阅读 -
文档评分













