LPAD / RPAD 是什么
LPAD 与 RPAD 把字符串补齐到指定长度:LPAD 从左侧补,RPAD 从右侧补,MySQL、PostgreSQL、Oracle 都提供。它们同时是截断工具:目标长度小于原串长度时,LPAD 从左侧截断、RPAD 从右侧截断,这一点常被忽略导致数据被悄悄切掉。补位结果始终是字符串,不能当作数值参与运算,也不适合直接用于数值列的比较与排序。
基本信息
| 适用平台 | MySQL 8.0 / PostgreSQL / Oracle / SQL Server(SQL Server 无同名函数,需用 RIGHT/LEFT + REPLICATE 组合) |
|---|---|
| 语法 | LPAD(字符串, 目标长度, 填充串)、RPAD(字符串, 目标长度, 填充串) |
| 超长行为 | 目标长度小于原串长度时截断:LPAD 保留右侧字符,RPAD 保留左侧字符 |
| 填充串 | 不足部分会用填充串循环重复补齐 |
| NULL 行为 | 任一参数为 NULL 时结果为 NULL |
典型使用场景
- 生成固定长度编码:订单号、工号不足位左补 0
- 文本报表对齐:把变长字段补到统一宽度
- 定长截断:从右侧截断长文本用于列表展示
- 脱敏展示:保留尾部几位,前面用固定字符填充
- 拼接定宽数据文件:给下游系统的固定宽度格式准备字段
补齐示例
补齐示例
SELECT LPAD('42', 6, '0') AS padded_code, # 000042,左补零
RPAD('AB', 5, '*') AS padded_right, # AB***
LPAD('13800000000', 18, ' ') AS aligned, # 右对齐显示
RPAD('13800000000', 11, '*') AS shown, # 长度已够,原样返回
LPAD(NULL, 5, '0') AS null_demo; # NULL
SELECT LPAD('ABCDEF', 10, 'xy') AS repeat_demo; # xyxyABCDEF:填充串循环使用截断行为要小心
截断行为要小心
# 目标长度小于原串时会截断:LPAD 从左截,RPAD 从右截
SELECT LPAD('ABCDEF', 4, 'x') AS l_trunc, # CDEF:保留右侧
RPAD('ABCDEF', 4, 'x') AS r_trunc; # ABCD:保留左侧
-- 只想要固定长度展示时,先确认源数据长度上限
SELECT order_no, RPAD(order_no, 20, ' ') AS fixed_width
FROM orders
WHERE CHAR_LENGTH(order_no) > 20; # 先把超长的挑出来核对行为速查
| 表达式 | 结果 | 说明 |
|---|---|---|
| LPAD('42', 6, '0') | 000042 | 左侧补零 |
| RPAD('AB', 5, '*') | AB*** | 右侧补星号 |
| LPAD('ABCDEF', 4, 'x') | CDEF | 超长时从左侧截断 |
| RPAD('ABCDEF', 4, 'x') | ABCD | 超长时从右侧截断 |
| LPAD(NULL, 5, '0') | NULL | 任一参数为 NULL 即返回 NULL |
补位后仍是字符串:工号、商户号这类以 0 开头的编号应始终以字符串存储和查询;数值运算场景保留数值类型,只在展示层补位,避免两种形态混用。
在 WHERE 里对列套 LPAD 会让该列的索引失效;需要按补位后的形态查询时,应在写入时就存成规范形态,或建立对应的生成列与索引。