CHR 是 Oracle 中一个基础的字符串函数,它的作用是将数字代码转换为对应的字符,可以理解为 ASCII 函数的反函数。
📖 CHR函数的语法与参数
CHR 函数的基本语法非常简洁:
sql
CHR( n [ USING NCHAR_CS ] )
- n**(NUMBER)** :用于检索字符的数字代码。
- USING NCHAR_CS**(** 可选 ) :若指定此子句,函数将使用数据库的"国家字符集"进行转换,并返回 NVARCHAR2 类型。若不指定,则默认使用"数据库字符集"(如 AL32UTF8),返回 VARCHAR2 类型。
⚙️ 参数 n 与返回值处理规则
- NULL 值 :如果参数为 NULL,函数返回 NULL。
- 负数 :如果参数为负数,函数将报错。
- 单字节字符集 :若参数 n 在 0 到 255 之间,返回其直接对应的字符。若 n > 256,则返回 n mod 256 所对应的字符。
- 多字节字符集 :参数 n 必须对应一个 完整的代码点 (Code Point),例如在 AL32UTF8 下,CHR(41378) 才是一个有效字符。由无效代码点可能导致结果不确定。
🛠️ 常用场景与典型示例
1. 🔧 用于生成特殊控制字符
这是 CHR 最常用的场景,常与 || 拼接符结合使用,在 SQL 语句中直接构建包含特殊字符的字符串。
| 场景 | ASCII码 | CHR函数 | 说明 |
|---|---|---|---|
| 制表符 | 9 | CHR(9) | 用于文本水平对齐 |
| 换行符 (LF) | 10 | CHR(10) | 在字符串内插入换行 |
| 回车符 (CR) | 13 | CHR(13) | 常用于与换行符组合 (CHR(13) |
| 空格 | 32 | CHR(32) | 在字符串中插入空格 |
| 单引号 | 39 | CHR(39) | 在 SQL 语句中表示单引号 |
| 双引号 | 34 | CHR(34) | 用于包裹动态生成的标识符 |
| '&' 符号 | 38 | CHR(38) | 避免被 SQL*Plus 视为替换变量 |
| '@' 符号 | 64 | CHR(64) | 用于邮件地址等场景 |
场景示例:格式化地址
sql
SELECT name || CHR(10) || address_line1 || CHR(10) || city || ', ' || state AS full_address
FROM customers;
此语句将地址信息分行输出,提升可读性。
2. 🔄 ASCII码与字符互转
CHR 与 ASCII 函数功能相反,常用于字符编码的转换操作。
sql
-- CHR将数字转换为字符,ASCII将字符转换为数字
SELECT CHR(65) as char_from_ascii, ASCII('A') as ascii_from_char FROM DUAL;
--结果: char_from_ascii: 'A', ascii_from_char: 65
场景示例:动态生成字母序列
sql
--生成从A到Z的字母列表
SELECT CHR(LEVEL + 64) AS letter FROM DUAL CONNECT BY LEVEL <= 26;
此查询利用层次查询和 CHR 函数,巧妙地生成了字母表序列。