1366 字符串值不正确:"\x89lise"列(仅第一个字节/第一个字符)



我正试图向MySQL表中添加一条新记录,但收到以下错误:

An exception occurred while executing 'INSERT INTO team_mate (id, first_name, cached_sessions_count, created_at, updated_at) VALUES (?, ?, ?, ?, ?)' with params ["xb6xc4xcfx4ex19xccx43x04x82x63x79x31xecx21x5ex66", "x3fx89x6cx69x73x65", 0, "2019-10-28 20:11:42", "2019-10-28 20:11:42"]: SQLSTATE[HY000]: General error: 1366 Incorrect string value: 'x89lise' for column 'first_name' at row 1

非常奇怪的是,插入一个名为Élise的新记录不起作用(并产生此错误(,但插入一个Élise确实起作用,事实上,只有当字段的第一个字节或第一个字符包含重音字符时,才会发生错误。

设置:

  • 我使用MySQL 8.0.18
  • 我使用字符集utf8mb4连接到数据库
  • team_mate具有排序规则utf8mb4_unicode_ci
  • 表中的字段first_name具有排序规则utf8mb4_unicode_ci

从连接执行的show variables like '%colla%';的结果:

collation_connection = utf8mb4_unicode_ci
collation_server = utf8mb4_unicode_ci
collation_database = utf8mb4_unicode_ci

从连接执行show variables like '%charac%';的结果:

character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_database = utf8mb4
character_set_filesystem = binary
character_set_results = utf8mb4
character_set_server = utf8mb4
character_set_system = utf8

谢谢!

好吧,别介意,我不应该责怪Symfony/Doctrine/MySQL。。。经过一些调试,我发现我在代码中有这个功能:

public function setFirstName(string $firstName): self
{
$this->firstName = mb_strtoupper(substr($firstName, 0, 1)).substr($firstName, 1);
}

它应该将第一个字符大写,但由于第一个字符的长度超过了一个字节,这会创建错误的字节,从而阻止在数据库中插入。我把substr换成了mb_substr,然后一切都很顺利!

问题解决了,谢谢艾尔顿!

最新更新