mysql的substring函数有三种等价写法:substring(str, pos)、substring(str from pos)、substring(str, pos, len),位置pos从1开始;默认按字符截取,需确保字符集为utf8mb4;substr是其完全同义词;提取邮箱用户名等场景应优先使用substring_index而非组合locate+substring。
MySQL 的 SUBSTRING 函数怎么用?基本语法和参数顺序别搞反
SUBSTRING 在 MySQL 中有三种等价写法:SUBSTRING(str, pos)、SUBSTRING(str FROM pos)、SUBSTRING(str, pos, len)。注意:位置 pos 从 1 开始(不是 0),这点和多数编程语言不同,容易导致截取错位。
常见错误是把起始位置当成了 0 基索引,比如想取第 2 个字符却写了 SUBSTRING('abc', 0, 1),结果返回空字符串 —— 因为 MySQL 把负数或 0 当作无效起始点,部分版本甚至静默返回 NULL。
-
SUBSTRING('hello', 2)→'ello'(从第 2 个字符开始到末尾) -
SUBSTRING('hello', 2, 3)→'ell'(从第 2 个开始,取 3 个字符) -
SUBSTRING('hello' FROM 2 FOR 3)→ 等价于上一条,FOR是可选关键字
遇到中文或 UTF8 字符时,SUBSTRING 按字节还是按字符截?
MySQL 的 SUBSTRING 默认按「字符」截取,前提是列的字符集是 utf8mb4 且排序规则支持多字节字符(如 utf8mb4_unicode_ci)。但如果连接或会话的 character_set_client 设置不一致,可能触发隐式转换,导致中文被截成乱码或半个字符。
验证方式:执行 SELECT LENGTH('你好'), CHAR_LENGTH('你好');。若前者返回 6(UTF8MB4 下每个汉字占 3 字节)、后者返回 2,说明 CHAR_LENGTH 才是真实字符数,而 SUBSTRING 内部依赖的是 CHAR_LENGTH 逻辑 —— 所以它切的是字符,不是字节。
- 确保表字段用
utf8mb4,避免用过时的utf8(实际只支持最多 3 字节) - 避免在
WHERE条件中对大字段用SUBSTRING做模糊匹配,无法走索引 - 如果必须按字节截(极少见),得先转成二进制:
SUBSTRING(CAST(col AS BINARY), 5, 2)
SUBSTR 和 SUBSTRING 有什么区别?可以混用吗?
完全一样。SUBSTR 是 SUBSTRING 的同义词,MySQL 官方文档明确说明二者行为无任何差异,函数签名、参数含义、NULL 处理全部一致。代码里用哪个纯看团队风格或历史习惯。