1.转码存储
将内容转码存储 如:转成 Unicode 存储,取出来时在解码
2.过滤 Emoji PHP
function filterEmoji($str)
{
$str = preg_replace_callback('/./u', function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
}, $str);
return $str;
}
3.MySQL存储Emoji
使用MySQL存储Emoji, 只需要数据表的字符集为 utf8mb4 即可, 即 CHARSET=utf8mb4 .
Mysql>=5.5
查看MySQL说支持的所有字符集
mysql> show charset;
查看某张表当前的字符集
mysql> show create table <table_name>;
修改数据库字符集
alter database <db_name> default charset = utf8mb4;
获取 修改表字符集 语句
SELECT CONCAT('alter TABLE ',TABLE_NAME,' default charset = utf8mb4;')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='<db_name>' AND TABLE_TYPE='BASE TABLE';
获取 修改表里面字段字符集 语句
SELECT CONCAT('alter TABLE ',TABLE_NAME,' convert to character set utf8mb4;')
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='<db_name>' AND TABLE_TYPE='BASE TABLE';
MySql 出现错误
1067 - Invalid default value for 'created_at'
修改默认的 Mysql 配置
> sudo vi /etc/mysql/my.cnf
在 [mysqld] 区域添加:
sql_mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
1071 - Specified key was too long; max key length is 767 bytes
原因
MySql的varchar索引只支持不超过768个字节 或者 768/3=256个三字节的字段 或者 768/4=192个四字节 字> 段 而 utf8mb4 是四字节的,UTF-8是三字节的。
决解
设置合适的索引
参考
http://www.jb51.net/article/88805.htm
https://laravel-china.org/topics/2094/invalid-default-forcreated-atresolved-value