两个函数做什么
REPEAT 把字符串重复 n 次,REVERSE 把字符串顺序倒过来,MySQL 与 PostgreSQL 都有这两个同名函数。典型用途是造分隔线、生成占位文本、验证回文以及排查尾部空白与不可见字符。MySQL 另有 SPACE(n) 直接生成 n 个空格,PostgreSQL 没有,用 repeat(' ', n) 代替。
基本信息
| 适用平台 | MySQL / PostgreSQL 均有 repeat 与 reverse |
|---|---|
| 语法 | REPEAT(str, n)、REVERSE(str) |
| 边界 | n <= 0 返回空串;任一参数为 NULL 结果为 NULL |
| MySQL 专有 | SPACE(n) 生成 n 个空格 |
典型使用场景
- 生成报表分隔线与对齐填充,让文本输出更易读
- 造长占位串测试字段长度上限与截断行为
- 验证回文或字符串处理逻辑,反转是最快的目视检查
- 排查尾部空白与不可见字符:反转后它们出现在开头更容易看到
- 生成测试数据填充定长字段
MySQL 写法
MySQL 写法
SELECT REPEAT('-', 10); -- '----------' 十个连字符
SELECT REPEAT('ab', 3); -- 'ababab'
SELECT REVERSE('abc'); -- 'cba'
SELECT SPACE(5); -- ' ' 五个空格,MySQL 专有
SELECT REPEAT('x', 0); -- '' n <= 0 返回空串
SELECT REVERSE('中文'); -- 按字符反转,不会拆坏多字节字符PostgreSQL 写法
PostgreSQL 写法
SELECT repeat('-', 10); -- '----------'
SELECT reverse('abc'); -- 'cba'
SELECT repeat(' ', 5); -- 五个空格,PG 没有 SPACE()
SELECT length(reverse('中文')); -- 2,按字符计数边界情形与返回值
| 情形 | 返回值 |
|---|---|
| n = 0 | 空串 '' |
| n < 0 | 空串 ''(两库一致) |
| 任一参数为 NULL | NULL |
| 多字节字符 | 按字符计数与反转 |
| n 很大 | 结果串随之膨胀,受内存与结果集大小限制 |
生成超长串会占用内存并把结果集撑大,MySQL 还会受 max_allowed_packet 约束;用大 n 做测试时先算一下结果体积,或改为分片拼接。
REVERSE 在多字节字符集下按字符反转,不会把汉字切开;但如果先按字节拼接再反转、或两侧字符集不一致,比较结果可能与直觉不符。
与 LPAD/RPAD 的分工:LPAD/RPAD 按指定总长度补齐并可能截断,适合定长对齐;REPEAT 只负责重复,长度由 n 决定。做定长报表时用 LPAD/RPAD 更直接。
快速判断回文的写法:先去掉空白、统一大小写,再比较 s 与 REVERSE(s) 是否相等。注意 None/NULL 与空串要分开处理,空串反转后仍是空串。