LEFT函数跨数据库写法不统一:MySQL/SQL Server用LEFT(col,n),PostgreSQL用substring(col from 1 for n)或left(col,n)(9.1+),SQLite用substr(col,1,n),Oracle用SUBSTR(col,1,n);输入为NULL时返回NULL,需用COALESCE等处理;长度超限时返回原字符串;WHERE中使用会导致索引失效,建议改用LIKE或函数索引。

LEFT 函数在不同数据库里写法不统一
MySQL 和 SQL Server 支持 LEFT(),但 PostgreSQL、SQLite、Oracle 默认不认这个函数——直接用会报错 function left() does not exist 或类似提示。PostgreSQL 用 substring(),SQLite 用 substr(),Oracle 用 SUBSTR()。别一上来就写 LEFT(col, 3),先看自己连的是哪个库。
实操建议:
- MySQL / SQL Server:放心用
LEFT(column_name, n) - PostgreSQL:改用
substring(column_name from 1 for n)或left(column_name, n)(9.1+ 版本才支持,需确认) - SQLite:用
substr(column_name, 1, n)(注意参数顺序是“起始位置、长度”,不是“列名、长度”) - Oracle:用
SUBSTR(column_name, 1, n)
LEFT 返回 NULL 的常见原因
LEFT() 本身不会因为输入为空字符串返回 NULL,但它对 NULL 输入会直接返回 NULL——这是很多初学者踩坑的地方。比如 LEFT(NULL, 5) 结果就是 NULL,不是空字符串。
如果你的字段可能为 NULL,又想确保结果始终是字符串(哪怕空),得提前处理:
- MySQL:用
COALESCE(LEFT(col, 5), '') - PostgreSQL / Oracle:同理,
COALESCE(substring(col from 1 for 5), '') - SQL Server:可用
ISNULL(LEFT(col, 5), '')或更通用的COALESCE()
别指望 LEFT() 自动兜底,它很老实,NULL 进,NULL 出。
长度参数超过原字符串时的行为
所有支持 LEFT() 的数据库(MySQL、SQL Server)都约定:当第二个参数(长度)大于字符串实际长度时,返回整个字符串,不报错也不补空格。比如 LEFT('abc', 10) 就是 'abc'。
这点和 SUBSTR() 系列一致,但要注意和某些编程语言(如 Python 的切片)的区别:SQL 不会因越界而崩溃,但也不会给你 padding。所以没必要提前 LENGTH() 判断长度再取 min,直接传大数更简洁。
不过如果业务逻辑依赖“固定长度输出”,就得自己补位,例如:LEFT(CONCAT(col, ' '), 5)(MySQL)或用 LPAD() 配合。
性能影响:LEFT 通常不走索引,除非配合函数索引
在 WHERE 条件里写 WHERE LEFT(name, 3) = 'abc',绝大多数数据库无法利用 name 字段上的普通 B-tree 索引——因为函数改变了原始值的有序性。执行计划里大概率看到全表扫描。
优化思路有限但明确:
- MySQL 8.0+ / PostgreSQL:可建函数索引,如
CREATE INDEX idx_name_prefix ON table ((LEFT(name, 3))) - 更通用做法:加一个生成列(generated column)存前缀,再对该列建索引
- 简单场景下,用
name LIKE 'abc%'替代,能走索引且语义等价
别为了图方便在 WHERE 里堆函数,尤其数据量上去之后,慢得悄无声息。

















