# P27 27. 基础-函数-字符串函数

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P27 27. 基础-函数-字符串函数

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=27（p=27），时长 15:09
- 讲义：3.1 字符串函数 p54–56（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p27.sql（先执行，再对照小例）

### 一句话理解

字符串函数把文本当材料加工；最常用的是补位——工号不足 5 位就在左边补 0。

### 跟播：视频里 ↔ 本站

视频先过七个字符串函数，最后给「工号统一 5 位、不足补 0」的练习页。

| 视频里 / 原课字段 | 本站对应 |
|---|---|
| emp.workno（讲义的员工工号列） | employee.workno（本站练习表新增的一列） |
| update emp set workno = lpad(workno, 5, '0') | update employee set workno = lpad(workno, 5, '0')（同一写法） |

看完应能：能先 SELECT 预览、再 UPDATE，并说清 LPAD 三个参数各是什么

看视频时以讲义表为准，跟练时用本站表；结构相同、数字不同。

### 步骤

1. 补位：LPAD(原串, 目标总长度, 填充串) 在左边补到指定长度，RPAD 在右边补。三个参数各管一件事：处理谁、最终几位、用什么补。
2. 先预览再改：`SELECT workno, LPAD(workno, 5, '0')` 看结果对不对，再写 `UPDATE … SET workno = LPAD(workno, 5, '0')`，最后回读确认。
3. 拼接与大小写：CONCAT(a,b) 连接字符串，LOWER/UPPER 统一大小写；清理用 TRIM 去首尾空格，截取用 SUBSTRING(串, 起始位置, 长度)，位置从 1 起。
4. 数字符还是数字节：CHAR_LENGTH 数「字」，LENGTH 数「字节」，中文在 utf8mb4 下占 3 字节。

### SQL 示例

```
-- 表：employee(id, name, workno)，工号现在是 '7'、'12'、'345'
-- 建表与插入见本页练习脚本 p27.sql（独立练习库 mysqlnotes_p27）

-- 第 1 步：先预览，不改数据。LPAD(原串, 目标总长度, 填充串)
SELECT id, workno, LPAD(workno, 5, '0') AS 补齐后
FROM employee
ORDER BY id;

-- 第 2 步：确认预览对了，再把函数写进 UPDATE 的列位置
UPDATE employee
SET workno = LPAD(workno, 5, '0');

-- 第 3 步：回读，确认列真的改了
SELECT id, workno FROM employee ORDER BY id;
```

说明：第 1 步结果三行：00007、00012、00345。三个参数分别是：要处理的字符串（这里是列 workno）、目标总长度 5、左边填充的字符 '0'。它保证「最终长度是 5」，所以比 5 位长的工号会被截断（LPAD('1234567',5,'0') 得 '12345'），不是只补不截。第 2 步影响 3 行——函数套在列上会对每一行各算一次；改之前先 SELECT 预览，是因为 UPDATE 写错要再改回来。第 3 步回读应看到 00007、00012、00345。

### 顺手验证：LPAD 超长会截断

```sql
SELECT LPAD('7', 5, '0') AS 补零, LPAD('1234567', 5, '0') AS 太长被截断;
```

说明：一行：00007、12345。目标长度是硬指标——短了补、长了截，所以别把它当「只追加」。

预期结果：00007、12345

### 其他函数速查

| 函数 | 做什么 | 一句话例子 |
|---|---|---|
| CONCAT(s1, s2, …) | 拼接成一个字符串 | CONCAT('emp-', '007') → emp-007 |
| LOWER / UPPER | 转小写 / 大写 | UPPER('mysql') → MYSQL |
| RPAD(s, n, pad) | 右侧填充到 n 个字符 | RPAD('7', 3, '-') → 7-- |
| TRIM(s) | 去掉首尾空格 | TRIM(' mysql ') → mysql |
| SUBSTRING(s, start, len) | 从第 start 位取 len 个字符（从 1 起） | SUBSTRING('mysql', 2, 3) → ysq |
| CHAR_LENGTH / LENGTH | 字符数 / 字节数 | CHAR_LENGTH('数据库')=3，LENGTH('数据库')=9 |

### 易错点

- 用 LENGTH 判断字符数：中文一个字多个字节，LENGTH('数据库')=9 而字符数是 3，长度校验会误判。
- 以为 LPAD 只会补：目标长度比原串短时它会截断，LPAD('abcdef',3,'0') 得 'abc'。
- SUBSTRING 起始位置写 0 以为从第一个字符开始：MySQL 位置从 1 计，写 0 得到空串。
- 不预览直接 UPDATE：改错要再写一条 UPDATE 改回来，先 SELECT 一遍成本更低。

### 30 秒速记

LPAD(原串, 总长度, 填充串) 三个参数；先预览再 UPDATE 再回读；位置从 1 起；CHAR_LENGTH 字符、LENGTH 字节。

### 自测

1. 为什么校验“姓名不超过 10 个字”要用 CHAR_LENGTH 而不是 LENGTH？
   - 答：LENGTH 返回字节数，utf8mb4 下一个汉字 3 字节，10 个汉字会被算成 30，校验立刻误判；CHAR_LENGTH 才是字符个数。
2. LPAD('7',3,'0') 和 LPAD('1234',3,'0') 分别得到什么？为什么？
   - 答：'007' 和 '123'。LPAD 的目标是“最终长度为 3”，不足就补、超出就截断，它不保证只在左侧追加。

### 材料与来源

- [平台视频页] P27 原视频页（BV1Kr4y1i7ru） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=27
- [官方文档] MySQL 8.0 Reference：字符串函数 https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

证据说明：按 t30 帧核对：画面为「字符串函数」章节页；t80 帧是练习页，题干要求把员工工号统一成 5 位、不足补 0（示例 1 号写成 00001），与讲义 p56 案例的 `update emp set workno = lpad(workno, 5, '0')` 对应。函数清单另由 P31 小结页与讲义 p55 表格（CONCAT、LOWER、UPPER、LPAD、RPAD、TRIM、SUBSTRING）核对。原声字幕未取得，讲师逐条演示与结果未核实；正文示例与数字为原创，并在 MySQL 8.0.46 实跑核对。
