必须设置utf8mb4,否则emoji和生僻汉字会被截断或报错;需修改my.cnf/my.ini的[mysqld]段设character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci,重启后验证,建表时字段须显式指定character set utf8mb4,客户端连接也必须设charset=utf8mb4。

utf8mb4 是必须的,否则哪怕用了 LONGTEXT,遇到 emoji 或某些生僻汉字也会被截断或报错。
确认并设置 server 层字符集
MySQL 服务启动时默认用的是 latin1 或 utf8(即 utf8mb3),这会导致超长 Unicode 字符(如 emoji、中文生僻字、数学符号)无法完整存入。必须显式配置为 utf8mb4:
- 编辑
my.cnf或my.ini(Linux 通常在/etc/mysql/my.cnf,Windows 在 MySQL 安装目录下) - 在
[mysqld]段落中添加:
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
重启 MySQL 服务后,执行 SHOW VARIABLES LIKE 'character_set_server'; 和 SHOW VARIABLES LIKE 'collation_server'; 确认值已生效。
建表时指定字段字符集
即使 server 层设对了,单个表或字段仍可能继承旧默认值。建表语句必须显式声明:
-
TEXT、LONGTEXT等类型本身不限制字符集,但存储行为取决于字段定义 - 错误写法:
content TEXT→ 会继承表默认字符集,风险高 - 正确写法:
content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
示例:
CREATE TABLE articles ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, body LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci );
客户端连接也要用 utf8mb4
应用层连接 MySQL 时,如果不声明字符集,即使服务端配置正确,也会在传输途中出问题:
- PHP PDO:连接 DSN 中加
;charset=utf8mb4 - Node.js mysql2:
charset: 'utf8mb4'放在 connection config 里 - Java JDBC URL:加
?characterEncoding=utf8mb4 - 命令行客户端:启动时加
--default-character-set=utf8mb4,或登录后执行SET NAMES utf8mb4;
验证当前连接字符集:SHOW VARIABLES LIKE 'character_set_client';、SHOW VARIABLES LIKE 'character_set_connection';,二者都应为 utf8mb4。
注意 row size 限制和实际容量
LONGTEXT 理论支持约 4GB,但实际能存多少字符,取决于:
- 字符编码:UTF-8 下,ASCII 字符占 1 字节,emoji 占 4 字节 → 同样长度的字符串,字节数可能差 4 倍
- MySQL 行大小限制(
innodb_page_size默认 16KB):如果一行里多个大字段,可能触发Row size too large错误 - 避免把多个
LONGTEXT放同一张表;必要时拆表,或只保留一个主文本字段 + 其他元数据
插入超长内容前,建议先用 LENGTH() 查看字节长度:SELECT LENGTH('?你好'); → 返回 7(1 个 emoji 占 4 字节 + 2 个汉字各占 3 字节)。
LONGTEXT 就只是个摆设。











