几年来我一直有一个奇怪的问题。事情是这样的。
我运行 Rocky Linux(也发生在 CentOS 中),运行 Apache 2.4.53 和 MariaDB(mysql Ver 8.0.30 for Linux on x86_64(Source distribution)
我有一个 Tcl 脚本,它执行“curl”以从另一个站点检索数据。它采用 JSON 格式,然后我对其进行解析(使用 JSON 包)。然后我将数据插入数据库,例如:
insert into table set name='Mário Flores';
如您所见,有一个 UTF-8 字符 (á)。我有 utf8mb4 字符集的数据库,一切都设置正确,系统中的语言环境是“en_US.UTF-8”。
现在...如果我在我的 Linux 机器上运行脚本,就没有问题了。 如果我使用我的网站,我点击一个按钮,它向我的网络服务器(index.cgi)发送一个 POST,我得到一个错误:
Error: mysqlexec/db server: Incorrect string value: '\xE1rio...' for column 'name' at row 1
然后将运行“curl”以获取数据、解析 JSON 并插入到数据库中。代码是一样的,调用方式一样。
这里可能是什么问题?我只能在通过网络运行时解决问题:
set name [encoding convertto utf-8 $name]
然后插入到数据库中。
在 Linux 或网络上都尝试过,结果不同。期望一切都已经与 UTF-8 兼容并且不需要转换
\xE1
听起来像 latin1,绝对不是 utf8。然后连接,设置client的字符集编码。或者,在连接后使用SET NAMES latin1;
。
E1 是以下任何一个中 á 的十六进制:cp1250、dec8、latin1、latin2、latin5。
C3A1 是 utf8 / utf8mb4 中的下一个。