REPEAT是MySQL中按指定次数重复字符串的函数,语法为REPEAT(str, count),count为非负整数,小数自动截断,负数或NULL返回NULL;它不用于补位对齐,应改用LPAD/RPAD。

REPEAT 函数在 MySQL 中的正确用法
MySQL 的 REPEAT 函数不是用来“填充到固定长度”的,而是按指定次数重复一个字符串。想生成 10 个 '0',得写 REPEAT('0', 10),而不是传入目标长度和原字符串让函数自动算次数。
常见错误是误以为它类似 Python 的 str.zfill() 或 SQL Server 的 REPLICATE() + RIGHT() 组合——它不接受“目标长度”参数,只认“重复次数”。
- 语法固定为:
REPEAT(str, count),count必须是非负整数;负数或 NULL 会返回NULL - 如果
count是小数,MySQL 会自动截断取整(如REPEAT('x', 3.9)→'xxx') - 结果长度 =
LENGTH(str) * count,不是你期望的“最终字符串长度”
如何用 REPEAT 实现“补足到固定长度”(比如左补零)
要达到“把数字补成 6 位,不足前面加 0”,不能只靠 REPEAT,必须配合 LPAD ——这才是 MySQL 里真正干这事的函数。但如果你坚持用 REPEAT 手动实现,就得自己算补几个零:
SELECT CONCAT(REPEAT('0', 6 - LENGTH('42')), '42') AS padded;
上面这句输出 '000042',但隐患明显:
- 若原始值长度 ≥6(如
'1234567'),6 - LENGTH(...)为负,REPEAT返回NULL,整个结果变NULL - 必须额外用
GREATEST(0, 6 - LENGTH(x))包一层才安全:CONCAT(REPEAT('0', GREATEST(0, 6 - LENGTH(x))), x) - 性能比
LPAD(x, 6, '0')差,且可读性低,纯属绕路
REPEAT 在其他数据库里根本不存在
PostgreSQL、SQL Server、Oracle、SQLite 都没有 REPEAT 函数。别在跨库 SQL 里硬套它,否则直接报错 function repeat does not exist 或类似提示。
替代方案要按数据库来:
- PostgreSQL:用
RPAD('', n, 'x')或repeat('x', n)(注意函数名小写,且是 PostgreSQL 特有) - SQL Server:用
REPLICATE('x', n) - Oracle:用
RPAD('x', n * LENGTH('x'), 'x')(麻烦)或自定义函数 - SQLite:无内置等价函数,需应用层处理或升级到 3.38+ 用
printf('%.*s', n, 'x...')模拟(不推荐)
真正该用 LPAD / RPAD 的时候别硬上 REPEAT
REPEAT 的合理使用场景其实很窄:明确知道要重复多少次,比如生成分隔线 REPEAT('-', 50),或构造测试数据中的重复字段值。
一旦涉及“对齐”“补位”“固定宽度”,立刻切到 LPAD(str, len, pad) 或 RPAD ——它们才是专为此设计的,语义清晰、边界安全、跨版本兼容。
容易被忽略的一点:LPAD 第二个参数是目标总长度,不是补几个字符;如果原字符串超长,它会截断(MySQL 默认行为),这点和 REPEAT 完全不同,也更符合填充预期。










