mysql utf8mb4

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'

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值