我过去曾与这个问题作过斗争,结果发现解决方案是使用 utf8mb4
字符集,因为在 mysql 中 utf8
不支持 4 字节长的字符。我的领域:
CREATE TABLE `messages` (
...
`body` text CHARACTER SET utf8mb4,
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然后我尝试插入这个字符“😂”,我得到了
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x98\x82' for column 'body' at row 1
我正在使用 PHP PDO 并在我的 DSN 中指定了 charset=utf8mb4
但我什至尝试通过客户端连接到 MySQL 来直接插入它,但我仍然遇到错误。我错过了什么?
这是我设置连接的 PHP 代码
$charset = 'utf8mb4';
...
$pdo = new PDO("mysql:host={$host};dbname={$dbname};charset={$charset};", $user, $pass, [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4'
]);
在@sorak 的回答中添加了设置,SHOW VARIABLES LIKE 'char%'
的输出:
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
最佳答案
可以在这里找到可能的答案:https://dba.stackexchange.com/questions/89355/unable-to-insert-utf8mb4-characters-in-mysql-5-6
基本上,请确保您在 my.cnf
中指定了字符集定义:
[client]
default-character-set=utf8mb4
[mysqld]
character-set-server = utf8mb4
[mysql]
default-character-set=utf8mb4
然后重启服务:service mysql restart
关于php - MySQL HY000 1366 : Trying to store 4 byte utf8 character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48965913/