Oracle:CHR的典型用法

Oracle 数据库中的 CHR 函数主要用于将数字编码(ASCII 码或字符集代码点)转换为对应的字符。它是 ASCII 函数的逆运算。

以下是 CHR 函数的常见用法、语法细节及典型应用场景:

  1. 基本语法

CHR(n)

CHR(n USING NCHAR_CS)

‌n‌:一个数值表达式,代表字符的二进制编码值。

‌USING NCHAR_CS‌(可选):指定使用国家字符集进行转换,返回 NVARCHAR2 类型;默认使用数据库字符集,返回 VARCHAR2 类型。

  1. 常见用途与示例

A. 生成特殊控制字符(最常用场景)

在 SQL 查询、报表生成或字符串拼接中,经常需要插入不可见的格式控制字符。

数字代码 含义 常用场景 示例

9‌ 制表符 (Tab) 文本水平对齐 `SELECT 'ID' CHR(9) 'Name' FROM DUAL;`

10‌ 换行符 (Line Feed) 字符串内换行 `SELECT 'Line1' CHR(10) 'Line2' FROM DUAL;`

13‌ 回车符 (Carriage Return) 常与 LF 配合使用 `CHR(13) CHR(10)` 用于 Windows 风格换行

32‌ 空格 插入空格 `SELECT 'Hello' CHR(32) 'World' FROM DUAL;`

34‌ 双引号 避免转义麻烦 `SELECT 'He said ' CHR(34) 'Hi' CHR(34) FROM DUAL;`

应用示例:格式化地址输出‌

SELECT

name || CHR(10) ||

address_line1 || CHR(10) ||

city || ', ' || state || ' ' || zip_code AS full_address

FROM customers;

B. ASCII 码与字符互转

用于测试、调试或动态生成特定字符。

CHR(65) 返回 'A'

CHR(97) 返回 'a'

CHR(48) 到 CHR(57) 返回 '0' 到 '9'

应用示例:动态生成字母序列‌

-- 生成 A-Z 的字母列表

SELECT CHR(LEVEL + 64) AS letter

FROM DUAL

CONNECT BY LEVEL <= 26;

C. 处理特殊符号

当键盘难以直接输入某些特殊符号,或在动态 SQL 构建中需要避免引号嵌套问题时,使用 CHR 非常有效。

CHR(39):单引号 ' (在动态 SQL 拼接中常用于包裹字符串值)

CHR(37):百分号 %

CHR(64):@ 符号

应用示例:动态 SQL 中的单引号处理‌

-- 假设要构建一个查询: SELECT * FROM emp WHERE ename = 'SMITH'

-- 使用 CHR(39) 可以避免复杂的引号转义

SELECT 'SELECT * FROM emp WHERE ename = ' || CHR(39) || 'SMITH' || CHR(39) FROM DUAL;

  1. 重要注意事项

‌字符集依赖性‌:

‌单字节字符集‌(如 WE8ISO8859P1):如果输入数字 n > 256,Oracle 会计算 n MOD 256 并返回对应字符。

‌多字节字符集‌(如 AL32UTF8, ZHS16GBK):输入的数字必须解析为一个完整的代码点(Code Point)。如果指定的代码点无效,结果是不确定的(indeterminate),且 Oracle 不会主动验证代码点的有效性。

‌平台可移植性‌:

CHR 函数的行为依赖于底层操作系统的字符编码架构(ASCII vs EBCDIC)。虽然现代主流系统(Linux, Windows, macOS)均基于 ASCII/Unicode,但在大型机(Mainframe)等 EBCDIC 架构上,相同的数字可能对应不同的字符。因此,涉及跨平台迁移时需谨慎。

‌NULL 处理‌:

如果输入参数为 NULL,CHR(NULL) 返回 NULL。

‌与 NCHR 的区别‌:

如果需要处理国家字符集(如存储多语言数据的 NVARCHAR2 字段),建议使用 NCHR(n),它等同于 CHR(n USING NCHAR_CS)。

总结

CHR 函数是 Oracle 中处理‌字符串格式化‌和‌特殊字符嵌入‌的核心工具。最典型的用法是利用 CHR(10)(换行)、CHR(9)(制表)和 CHR(32)(空格)来美化输出结果,或利用 CHR(39)(单引号)和 CHR(34)(双引号)来简化动态 SQL 的构建。

相关推荐
星蓝_starblue6 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三8448 小时前
sqli-labs1-10通关笔记
数据库
BullSmall10 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB10 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜10 小时前
5.1.1 原⼦性
数据库·mysql
机建狂魔10 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥11 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
moMo11 小时前
# 向量数据库入门:从"关键词匹配"到"语义理解"
数据库
ACP广源盛1392462567311 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
进击的女IT12 小时前
通过mysql中的Data目录恢复数据库数据
数据库·mysql