RPAD函数用于在字符串右侧填充指定字符至目标长度,参数为string(源字符串)、length(目标字符数,非字节)、pad_string(填充字符,默认空格);若原长≥length则截断,任一参数为NULL时返回NULL。

RPAD 函数的基本用法和参数含义
RPAD 是标准 SQL 中用于右填充的字符串函数,作用是把原字符串右侧补上指定字符,直到总长度达到目标长度。它在 Oracle、PostgreSQL、MySQL(8.0+)中都支持,但行为细节有差异。
基本语法:RPAD(string, length, pad_string) —— 注意 pad_string 可以是单字符,也可以是多字符(但会被截断或循环使用,具体看数据库)。
-
string:待处理的原始字符串,可以是列名或字面量 -
length:期望的最终长度(字符数),若原字符串已 ≥ 该值,则直接返回原串,不截断 -
pad_string:填充用的字符串;Oracle 和 PostgreSQL 允许多字符,MySQL 仅取第一个字符(即使你传了'xx',也只用'x')
不同数据库对 RPAD 的实际处理差异
写一次 SQL 跑遍所有数据库?别信。最常踩的坑就是假设 RPAD 行为一致。
比如想用 RPAD(name, 10, '0') 把姓名补到 10 位,右边填 0:
- Oracle / PostgreSQL:如果
name = 'abc'→ 结果是'abc0000000' - MySQL 8.0+:同样输入 → 结果也是
'abc0000000'(但如果你传'00',它只取第一个'0') - MySQL 5.7 及更早:根本**不支持**
RPAD,会报错FUNCTION xxx.RPAD does not exist - SQLite:没有
RPAD,得用substr('0000000000' || name, -10)这类绕法
常见错误:长度参数传错或类型不匹配
最容易被忽略的是 length 参数必须是整数,且不能为负数。一旦传入小数、NULL 或负值,各库反应不同:
- Oracle:
RPAD('a', -5, 'x')直接报错ORA-01428: argument ' -5' is out of range - PostgreSQL:
length为负时返回空字符串(''),不报错但结果意外 - MySQL:接受负数,但结果恒为空字符串,且无提示
- 如果
length来自某列(如RPAD(name, max_len, ' ')),而该列含 NULL,则整个结果变 NULL —— 别忘了用COALESCE(max_len, 10)防御
实战建议:何时该用 RPAD,何时该避免
它适合做格式化输出(如导出固定宽字段)、生成编码前缀、对齐日志,但不适合做业务逻辑判断或数据清洗。
- 导出报表时对齐字段:
SELECT RPAD(employee_id::text, 8, '0') AS id_code FROM employees - 不要用它“修复”数据长度问题:比如身份证号补零,
RPAD(id_card, 18, '0')会掩盖真实缺失,应先校验再报错 - 性能上无明显开销,但大量调用时注意:PostgreSQL 对超长
pad_string会内部循环拼接,若length是百万级,可能卡住 - 替代方案更可控:如需兼容 SQLite 或旧 MySQL,用
CONCAT+SUBSTRING组合,虽然啰嗦但行为确定
真正麻烦的不是函数怎么写,而是你没意识到目标数据库是否支持、填充规则是否一致、以及 length 来源是否可靠。

















