php - MySQL HY000 1366 : Trying to store 4 byte utf8 character

标签 php mysql encoding character-encoding

我过去曾与这个问题作过斗争,结果发现解决方案是使用 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/

相关文章:

php - MySQL表需要自增ID吗?

php - PHP递减NULL值问题

MySQL 函数在主服务器中失败,但在 localhost 中工作

php - PHPMailer 的阿拉伯语问题

Java Applet - 无法将默认平台编码更改为其他一些

php - 如何销毁 PHP 中的类对象?

java - Web框架性能比较

mysql - 如何删除mySQL中的某些字符串?

sql - mysql 日期时间快速结构

java - 使用阿拉伯字符创建 zip 文件