Why MySQL utf8 Doesn't Support Emoji
MySQL's utf8 charset is 3-byte only, which cannot store emoji (4 bytes). utf8mb4 is proper 4-byte UTF-8 with full Unicode and emoji support.
Configure my.cnf for utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4Convert Existing Database
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Collation Options
| Collation | Description | Use When |
|---|---|---|
utf8mb4_unicode_ci | Accurate Unicode comparison (CI) | Most websites (recommended) |
utf8mb4_bin | Byte-by-byte, case-sensitive | Passwords, hashes |
utf8mb4_0900_ai_ci | MySQL 8.0 Unicode 9.0 standard | MySQL 8.0+ projects |
PHP PDO Configuration
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'user', 'password',
[PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4']
);When upgrading from utf8 to utf8mb4, verify VARCHAR index columns do not exceed 191 characters (767 bytes limit with standard InnoDB settings).