LPAD函数用于左侧填充字符串,语法为LPAD(str, len, pad_str),其中str需为字符串类型,len为非负整数目标长度,pad_str取首字符;MySQL/Oracle原生支持,PostgreSQL用lpad(),SQL Server需模拟。

LPAD函数的基本用法和参数含义
LPAD不是所有数据库都支持,MySQL和Oracle原生支持,PostgreSQL要用lpad()(小写),SQL Server则没有直接对应函数。它的作用是用指定字符从左侧填充字符串,直到达到目标长度。
语法结构统一为:LPAD(str, len, pad_str),其中str是要处理的原始字符串,len是最终期望的总长度(不是补多少位),pad_str是填充字符(只取第一个字符,多于一个也不报错但无效)。
- 如果
str本身长度 ≥len,结果就是原字符串,不会截断 -
len必须是非负整数,传负数或NULL在MySQL中会返回NULL -
pad_str为空字符串时,结果也为NULL(不是原串)
给编号字段补零生成固定长度字符串
这是最常见场景:把ID为1、12、123的记录转成'0001'、'0012'、'0123'这样的4位编号。
假设表叫orders,主键列是id,想生成4位编号:
SELECT LPAD(CAST(id AS CHAR), 4, '0') AS order_no FROM orders;
注意必须先用CAST(id AS CHAR)或CONVERT(id, CHAR)转成字符串,否则MySQL会报错“Invalid argument for function LPAD”,因为LPAD不接受数值类型直接作为第一个参数。
- Oracle可省略CAST,它会自动隐式转换
- PostgreSQL要求显式转
text:LPAD(id::text, 4, '0') - 如果编号本身含前导空格(比如CHAR(10)字段),先
TRIM()再LPAD,否则空格会被当成有效字符参与长度计算
避免因字符集或排序规则导致填充异常
在MySQL中,如果列使用utf8mb4字符集且带emoji或中文,LPAD按字符数计长,不是字节数——这点和SUBSTR行为一致。但如果你误以为按字节算,可能发现补出来的长度不对。
例如:LPAD('a', 5, 'x') → 'xxxxa'(5字符);LPAD('?', 5, 'x') → 'xxxx?'(也是5字符,不是4个x加2字节)。
- 不要用
LPAD处理二进制数据(BLOB)或需要字节级控制的场景 - 若字段定义为
VARCHAR(10)但实际存的是'123'(3字符),LPAD(col, 10, '0')补7个0,结果长度是10 —— 这没问题;但如果该列有尾部空格(如用了PADCHAR模式),先RTRIM() - SQL Server用户得用
RIGHT(REPLICATE('0', 4) + CAST(id AS VARCHAR), 4)模拟,性能略差,且要注意REPLICATE最大重复次数限制(默认32767)
在INSERT或UPDATE中直接生成补零编号
可以在写入时就固化格式,比如生成订单号:INSERT INTO orders (order_no, ...) VALUES (LPAD(@next_id, 8, '0'), ...);
但要注意并发场景下@next_id如果是自增ID,需确保在事务内获取后再LPAD,否则可能多个会话拿到同一ID再补零,造成重复。
- 更稳妥的做法是:先INSERT获取
LAST_INSERT_ID(),再UPDATE设置order_no = LPAD(LAST_INSERT_ID(), 8, '0') - 不要在WHERE条件里对LPAD结果做索引查找——
WHERE LPAD(id, 4, '0') = '0042'无法走id索引,应改写为WHERE id = 42 - 如果业务要求编号全局唯一且格式固定,建议用触发器或应用层生成,避免在SQL里反复计算
LPAD参数没转字符串,或者WHERE里写了函数导致全表扫描。


















