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'