utf8 utf8mb4 什么区别

228 阅读2分钟

`utf8`和`utf8mb4`都是字符集,在MySQL数据库中,它们存在以下区别:

### 字符范围

- **`utf8`**:严格意义上,MySQL里的`utf8`其实是`utf8mb3`,它最多只能使用3个字节来存储一个字符。这意味着它能表示大部分常见的字符,如英文、中文、日文、韩文等。但对于一些生僻字符 (如某些 emoji 表情、罕见的汉字等),就无法进行表示了。

- **`utf8mb4`**:它是真正意义上的UTF-8,使用 1 - 4 个字节来存储一个字符。`utf8mb4`能够支持包括 emoji 表情、生僻汉字等在内的所有 Unicode 字符,字符范围更广。

### 存储空间占用

- **`utf8`**:由于一个字符最多占用3个字节,在存储常见字符时,占用空间相对较小。比如存储一个普通汉字,占用3个字节。

- **`utf8mb4`**:因为要兼容更多字符,单个字符最多占用4个字节。对于普通的英文字母,`utf8mb4`和`utf8`一样只占用1个字节,但是对于 emoji 表情等特殊字符,`utf8mb4`会占用4个字节,而`utf8`无法存储 ,相比`utf8`,在存储特殊字符时占用空间更大。

### 性能影响

- **`utf8`**:在查询、插入、更新等操作时,因为每个字符占用字节数相对固定且较少,数据库在处理字符数据时的计算量和 I/O 操作相对较少,性能上可能会略有优势。

- **`utf8mb4`**:由于每个字符占用字节数不确定,在进行数据处理时,数据库需要额外处理字节长度的计算和判断,在一些复杂的查询或者数据更新场景下,相比`utf8`可能会有一定的性能损耗。不过,随着硬件性能提升以及数据库优化,在大多数情况下,这种性能差异并不明显。

### 应用场景

- **`utf8`**:如果数据库只需要存储英文、中文等常见字符,不需要存储 emoji 表情等特殊字符,使用`utf8`可以节省一定的存储空间,并且在一定程度上提高数据库的处理性能。

- **`utf8mb4`**:如果应用程序需要支持存储和处理 emoji 表情、生僻字符等,或者未来有存储这些特殊字符的可能,就需要选择`utf8mb4`字符集。例如,社交类、内容创作类等应用场景中,为了满足用户多样化的输入需求,通常会使用`utf8mb4`字符集 。

综上,如果不确定未来数据是否会包含特殊字符,建议优先选择`utf8mb4`字符集,以避免后续因字符集不兼容而导致数据存储和显示问题。