mysql utf8mb4

    技术2025-09-19  29

    mysql utf8mb4

    mysql的utf-8是只支持3位的utf-8字符,但是有一些emoji表情用到了4位,所以要用mysql的utf8mb4字符集。 例如创建一个表:

    create table utf8mb4 (`name` varchar(200)) charset=utf8mb4;

    这个时候如果charset用utf8那么只能支持3位的utf-8字符集,插入4位的emoji表情时就会报错。

    然后用一个base64编码为:8J+Ysw==== 的emoji表情插入,它的unicode编码是\u f0 9f 98 b3 可以看到是4个字节的。 注意插入的时候客户端也要utf8mb4,也就是在set names的时候要设置为utf8mb4。例如:

    $dsn = "mysql:host=localhost;"; $db = new PDO($dsn, 'root', '123'); $db->exec("SET NAMES 'utf8mb4'"); try { $stmt = $db->prepare("insert into test.utf8mb4(name) values(:name)"); $ret = $stmt->execute(["name"=>base64_decode("8J+Ysw====")]); var_dump($stmt->errorInfo()); }catch (\PDOException $e) { echo $e->getMessage(); }

    上面的代码是可以插入成功的。 可以给utf8mb4的字段创建索引,然后用explain解释命中这个索引的的查询,就能看到key_len,就知道utf8mb4占用的字节大小了。不管用多大的varchar内容,都是用3个字节表示长度。4个字节表示一个字符。 也就是对于varchar(200),长度就是3+4*200=803

    总结: 创建表的字段的charset要用utf8mb4,客户端请求时要SET NAMES 'utf8mb4'

    Processed: 0.029, SQL: 9