即使使用utf8mb4_unicode_ci,MySQL仍然出现“Incorrect string value”错误。

3

我的数据库存储Garry's Mod服务器(Source Dedicated Servers)的服务器主机名,有时它们似乎包含utf8mb4_unicode_ci无法存储的字符。这些字符是什么,我该如何解决这个问题?

insert into `servers` (`steamid64`, `script_id`, `ip_address`, `port`, `uses`, `hostname`, `maxplayers`, `map`, `last_active`) values (XXXXXXXXXXXXXXX, 1599, XXXXXXXXXXX, 27095, 1, [FR] USA vs F?d?ration | Apocalypse | SeriousRP | TSF, 20, rp_evocity_dc, CURRENT_TIMESTAMP())

Incorrect string value: '\xE9d\xE9rat...'

Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE9d\xE9rat...' for column 'hostname' at row 1 (SQL: insert into `servers` (`steamid64`, `script_id`, `ip_address`, `port`, `uses`, `hostname`, `maxplayers`, `map`, `last_active`) values (XXXXXXXXXXXXXXX, 1599, XXXXXXXXXXXXXXXX, 27095, 1, [FR] USA vs F?d?ration | Apocalypse | SeriousRP | TSF, 20, rp_evocity_dc, CURRENT_TIMESTAMP()))
  File "app/Http/Controllers/PayloadController.php", line 243, in GetPayload
    $Server -> save();
  File "public/index.php", line 55
    $request = Illuminate\Http\Request::capture()
1个回答

1
你希望得到的是 "...édérat..." 吗?
你的客户端使用的是 latin1,而不是 utf8mb4。
也许最简单的解决方法是告诉 mysql 在客户端中使用 latin1。最好在连接字符串中完成这项操作。(你使用的是 PDO 还是 mysqli?)
注意:客户端的编码和数据库表中的编码是独立的。转码是自动进行的。但你必须在客户端中正确声明编码。

我正在使用Laravel通过PDO。它应该已经设置为utf8mb4。客户端发送的编码只是通过运行Lua的游戏服务器发送的HTTP请求,所以我不知道那可能是什么,但我相当确定它应该只使用UTF-8。 - Billy
@Billy - Hex E9 不是有效的 UTF-8 编码。它至少是表示 e-acute 的 latin1 编码。如果您可以更改 HTML,则应该将表单更改为类似于 <form accept-charset="UTF-8"> 的内容。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接