**1. 字符串拼接**
- **`CONCAT(str1, str2, ...)`**
连接多个字符串。
```sql
SELECT CONCAT('Hello', ' ', 'World'); -- 输出: Hello World
```
- **`CONCAT_WS(separator, str1, str2, ...)`**
使用指定分隔符连接字符串(忽略 NULL 值)。
```sql
SELECT CONCAT_WS('-', '2023', '05', '15'); -- 输出: 2023-05-15
```
**2. 字符串长度**
- **`LENGTH(str)`**
返回字符串的字节长度(多字节字符如中文占多个字节)。
```sql
SELECT LENGTH('你好'); -- 输出: 6(UTF-8 中一个中文占 3 字节)
```
- **`CHAR_LENGTH(str)`**
返回字符串的字符长度。
```sql
SELECT CHAR_LENGTH('你好'); -- 输出: 2
```
**3. 大小写转换**
- **`UPPER(str)` / `UCASE(str)`**
将字符串转换为大写。
```sql
SELECT UPPER('hello'); -- 输出: HELLO
```
- **`LOWER(str)` / `LCASE(str)`**
将字符串转换为小写。
```sql
SELECT LOWER('WORLD'); -- 输出: world
```
**4. 字符串截取**
- **`SUBSTRING(str, start, length)`**
从 `start` 位置开始截取长度为 `length` 的子串(位置从 1 开始)。
```sql
SELECT SUBSTRING('HelloWorld', 6, 5); -- 输出: World
```
- **`LEFT(str, length)`** / **`RIGHT(str, length)`**
返回字符串最左边/最右边的 `length` 个字符。
```sql
SELECT LEFT('Hello', 3); -- 输出: Hel
```
**5. 字符串替换**
- **`REPLACE(str, old_str, new_str)`**
将字符串中的 `old_str` 替换为 `new_str`。
```sql
SELECT REPLACE('Hello World', 'World', 'MySQL'); -- 输出: Hello MySQL
```
**6. 去除空格**
- **`TRIM([BOTH | LEADING | TRAILING] trim_str FROM str)`**
去除字符串两侧/左侧/右侧的指定字符(默认是空格)。
```sql
SELECT TRIM(' Hello '); -- 输出: Hello
SELECT TRIM(LEADING 'x' FROM 'xHello'); -- 输出: Hello
```
**7. 字符串位置**
- **`LOCATE(substr, str)`** / **`POSITION(substr IN str)`**
返回子串 `substr` 在 `str` 中首次出现的位置(从 1 开始,未找到返回 0)。
```sql
SELECT LOCATE('ll', 'Hello'); -- 输出: 3
```
**8. 字符串填充**
- **`LPAD(str, len, pad_str)`** / **`RPAD(str, len, pad_str)`**
用 `pad_str` 左/右填充字符串至长度 `len`。
```sql
SELECT LPAD('123', 5, '0'); -- 输出: 00123
```
**9. 字符串反转**
- **`REVERSE(str)`**
反转字符串。
```sql
SELECT REVERSE('Hello'); -- 输出: olleH
```
**10. 重复字符串**
- **`REPEAT(str, count)`**
重复字符串 `count` 次。
```sql
SELECT REPEAT('abc', 2); -- 输出: abcabc
```
**11. 字符串比较**
- **`STRCMP(str1, str2)`**
比较两个字符串(相等返回 0,`str1 > str2` 返回 1,否则返回 -1)。
```sql
SELECT STRCMP('a', 'b'); -- 输出: -1
```
**12. 其他函数**
- **`ASCII(str)`**
返回字符串第一个字符的 ASCII 码。
```sql
SELECT ASCII('A'); -- 输出: 65
```
- **`FORMAT(num, decimal_places)`**
格式化数字为千分位分隔的字符串。
```sql
SELECT FORMAT(1234.567, 2); -- 输出: 1,234.57
```
**示例综合应用**
sql
-- 组合使用多个函数:截取邮箱用户名并转为大写
SELECT UPPER(LEFT('user@example.com', LOCATE('@', 'user@example.com') - 1));
-- 输出: USER
**注意事项**
- **编码问题**:`LENGTH()` 和 `CHAR_LENGTH()` 的区别在处理多字节字符时尤为明显。
- **性能考虑**:函数操作可能导致索引失效,尽量避免在索引列上使用函数(如 `WHERE UPPER(name) = ' JOHN'`)。
根据具体需求选择合适的字符串函数,可以高效地处理和转换文本数据。