sql中字符串函数的语法特点_mysql字符串处理规则

5次阅读

MySQL 字符串函数需用单引号,双引号默认解析为标识符;位置索引从 1 开始;CONCAT 遇 NULL 即返回 NULL;大小写敏感性由列 collation 决定,非函数本身。

sql 中字符串函数的语法特点_mysql 字符串处理规则

MySQL 字符串函数必须用单引号包裹字面量

MySQL 不接受双引号作为字符串字面量的定界符(除非 SQL_MODE 启用了 ANSI_QUOTES),否则会报错 ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'。这是因为 MySQL 默认把双引号当成标识符(如列名、表名)处理,而非字符串。

实操建议:

  • 所有字符串参数统一用单引号,例如:CONCAT('Hello', '','World')
  • 若需在字符串中包含单引号,用两个单引号转义:'O''Reilly'
  • 避免依赖 ANSI_QUOTES 模式,它会让 "name" 被解析为字段名,和多数 ORM 或迁移 工具 行为冲突

LEFT、SUBSTRING 等截取函数的起始位置从 1 开始计数

不同于 Python 或 JavaScript 的 0-based 索引,MySQL 所有基于位置的字符串函数(LEFTSUBSTRINGMIDLOCATE)均以 1 为第一个字符的位置。传入 0 会返回空字符串或 NULL,不是“从开头”——这是最常踩的坑。

实操建议:

  • SUBSTRING('abcde', 1, 3)'abc'SUBSTRING('abcde', 0, 3)''(空字符串)
  • 想从第 n 个字符开始取,直接写 n,不要减 1;LOCATE('x', col) 返回值也从 1 起算
  • INSTR(str, substr) 可替代 LOCATE,语序相反但同样 1-based

CONCAT 函数遇到 NULL 直接返回 NULL,不自动跳过

CONCAT 是严格模式:只要任一参数为 NULL,整个结果就是 NULL。这和 CONCAT_WS(带分隔符版本)不同,后者会忽略 NULL 参数。

实操建议:

  • 拼接可能为 NULL 的字段时,优先用 CONCAT_WS('', col1, col2, col3),它自动跳过 NULL
  • 必须用 CONCAT 时,配合 IFNULLCOALESCE 显式兜底:CONCAT(IFNULL(name, ''),' ', IFNULL(surname,''))
  • 注意 CONCAT_WS 的第一个参数是分隔符,不能省略;传空字符串 '' 等效于无分隔拼接

大小写敏感性取决于列的 collation,不是函数本身

UPPERLOWERREPLACE 这些函数本身不决定比较逻辑;是否区分大小写,完全由字段定义的 COLLATION 决定(比如 utf8mb4_0900_as_cs 是区分大小写的,而 utf8mb4_0900_ai_ci 是不区分且带重音忽略的)。

实操建议:

  • 执行 SHOW FULL COLUMNS FROM table_name LIKE 'col_name'; 查看当前列的 Collation
  • 若需强制大小写敏感匹配,可在 WHERE 中加 BINARYWHERE BINARY name = 'John'
  • REPLACE(str, from_str, to_str) 是逐 字节 替换,不支持正则;需要正则替换得用 REGEXP_REPLACE()(MySQL 8.0+)
SELECT    name,   UPPER(name) AS upper_name,   REPLACE(LOWER(name), 'a', 'x') AS replaced_lower FROM users  WHERE BINARY name = 'Alice';

字符串处理真正难的不是记函数名,而是时刻意识到:MySQL 的“字符串”背后绑着字符集、排序规则、NULL 传播规则三重上下文。漏掉任意一个,CONCAT 就可能突然变 NULLSUBSTRING 就会切错位置,WHERE 就会查不到本该匹配的数据。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-09发表,共计1526字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。