Firebird Null Guide: NULL behaviour and pitfalls in Firebird SQL
479.63 KB
69 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
英语 | .pdf | 3 |
摘要 | ||
本文档详细阐述了Firebird SQL中NULL的行为及相关注意事项,涵盖了NULL的定义、在操作和函数中的处理方式、与NOT NULL的关系,以及历史与当前版本中的相关bug。文档指出了多个版本中NULL处理中的问题,如EXECUTE STATEMENT、EXTRACT、FIRST、SKIP等操作在NULL参数情况下的崩溃问题,及其在不同版本中的修复情况。此外,还介绍了测试NULL的正确方法,以及在布尔操作和数学运算中NULL的返回结果。同时,文档强调了 Firewall SQL在NOT NULL列中NULL值的特殊处理,并列举了涉及NULL的操作和函数的具体行为。 | ||
AI总结 | ||
《Firebird Null Guide: NULL behaviour and pitfalls in Firebird SQL》文档总结如下:
---
### **1. 什么是NULL?**
- NULL表示“未知”或“不存在”的值,是SQL中的一个特殊值。
- 在Firebird中,NULL的处理与其他数据库系统可能存在差异。
---
### **2. Firebird SQL对NULL的支持**
#### **2.1 禁止NULL**
- 可以通过在列或域定义中添加`NOT NULL`约束,禁止插入NULL值。
- 示例:
```sql
CREATE TABLE MyTable (i INT NOT NULL);
CREATE DOMAIN DTown AS VARCHAR(32) NOT NULL;
```
#### **2.2 测试NULL**
- 使用`IS [NOT] NULL`语法测试字段或表达式是否为NULL。
- 示例:
```sql
SELECT * FROM Pupils WHERE PhoneNumber IS NOT NULL;
```
#### **2.3 赋值NULL**
- 使用`=`运算符赋值为NULL。
- 示例:
```sql
UPDATE Potatoes SET Amount = NULL WHERE Amount < 0;
```
#### **2.4 测试两个表达式是否相同(Firebird 2+)**
- 使用`IS [NOT] DISTINCT FROM`测试两个表达式是否彼此相同,包括NULL的情况。
- 示例:
```sql
IF (A IS DISTINCT FROM B) THEN ...
```
---
### **3. NULL在操作中的行为**
#### **3.1 运算操作**
- 大多数算术和字符串操作符在至少一个操作数为NULL时返回NULL,包括:
- `+`, `-`, `*`, `/`
- `<>`, `<`, `<=`, `>`, `>=`
- `||`, `BETWEEN`, `LIKE`, `STARTING WITH`, `CONTAINING`
#### **3.2 布尔操作**
- 布尔操作结果如下:
- `NOT NULL = NULL`
- `NULL OR FALSE = NULL`
- `NULL OR TRUE = TRUE`
- `NULL AND FALSE = FALSE`
- `NULL AND TRUE = NULL`
---
### **4. 内部函数和指令**
#### **4.1 内部函数**
- 若至少一个参数为NULL,以下函数返回NULL:
- `CAST()`, `EXTRACT()`, `GEN_ID()`, `SUBSTRING()`, `UPPER()`, `LOWER()`, `BIT_LENGTH()`, `CHAR_LENGTH()`, `OCTET_LENGTH()`, `TRIM()`
- 注意事项:
- `EXTRACT`从NULL日期提取值会在旧版本崩溃,已修复。
- `SUBSTRING`在旧版本中可能返回“假空字符串”,需注意。
#### **4.2 FIRST, SKIP 和 ROWS**
- 在旧版本中,`FIRST`和`SKIP`若参数为NULL会导致服务器崩溃,已修复。
- Firebird 2中:
- `FIRST`和`SKIP`将NULL视为0。
- `ROWS`若参数为NULL返回空集。
---
### **5. 谓词**
- `SINGULAR`和`NOT SINGULAR`:
- 在Firebird 2.0之前,`SINGULAR`可能返回NULL,行为不一致。
- 从2.1起,`SINGULAR`返回:
- `FALSE`:如果搜索条件从未满足。
- `TRUE`:如果搜索条件恰好满足一行。
- `FALSE`:如果搜索条件满足多行。
- `NOT SINGULAR`总是返回与`SINGULAR`相反的结果。
---
### **6. NULL相关Bug**
#### **6.1 已修复的Bug**
- `EXECUTE STATEMENT` with NULL argument: crash旧版本,已修复。
- `EXTRACT` from NULL date:旧版本crash,已修复。
- `FIRST`和`SKIP` with NULL argument:旧版本crash,已修复。
- `LIKE` with NULL escape:旧版本crash,已修复。
#### **6.2 其他问题**
- NULL在`NOT NULL`列中:
- 新增`NOT NULL`列时,原有数据字段为NULL。
- 修改列为`NOT NULL`后,原有NULL值保留,但无法通过`gbak`恢复。
- NULL被错误返回为0, '', 等。
---
### **7. 文档历史**
- 文档版本更新记录详见附录,包括新增内容和修复。
---
### **总结**
文档详细介绍了Firebird SQL中NULL的行为、相关操作、内部函数、谓词及历史和当前的Bug。开发者需特别注意NULL的特殊处理和版本相关的Bug,以避免潜在问题。 |
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余
62 页请下载阅读 -
文档评分