Tcl,数据库插入 mysqlexec/db 服务器:字符串值不正确:

Tcl, database insertion mysqlexec/db server: Incorrect string value:

提问人:Miguel Frias 提问时间:4/17/2023 更新时间:4/17/2023 访问量:42

问:

几年来,我有一个奇怪的问题。事情是这样的。

我运行 Rocky Linux(也发生在 CentOS 中),运行 Apache 2.4.53 和 MariaDB(mysql Ver 8.0.30 for Linux on x86_64(源代码分发)

我有一个 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 或通过 Web 尝试过,结果不同。预计一切都已经与 UTF-8 兼容,无需转换

MySQL 的TCL UTF8MB4

评论

0赞 danblack 4/17/2023
mysql Ver 8.0.30 for Linux当您提到 MariaDB 时,看起来像客户端版本。如果它真的 MariaDB 包括 MariaDB 版本 .一般问题是 tcl 需要以某种方式使用 utf8mb4 字符集作为连接选项进行连接。 也许就像 SQL 一样。select version()set names utf8

答:

1赞 Rick James 4/17/2023 #1

\xE1听起来像 Latin1,绝对不是 UTF8。然后连接,设置客户端的字符集编码。或者,连接后使用。SET NAMES latin1;

E1 是以下任何一种情况下 á 的十六进制:cp1250、dec8、latin1、latin2、latin5。

C3A1 是 utf8 / utf8mb4 中的下一个。

至于“数据库中的数据是否......”......

  • 数据库中使用 utf8mb4 可以表示世界上的所有字符集,包括表情符号。
  • 通过正确的配置,MySQL很乐意在INSERTing/SELECTing时与UTF-8相互转换。目标字符集(在客户端中)基本上可以是任何编码。拉丁语 1 很常见;除了普通的 ASCII 字母、数字和简单的标点符号外,它还有大约 120 个额外的字符(重音字母和常用符号)。

列定义控制数据库中存储的内容。

连接参数指定客户端的字符集。

评论

0赞 Donal Fellows 4/17/2023
真正的问题是数据库中的数据是 UTF-8 还是 Latin-1。这很重要,因为它说明了问题出在插入还是提取。(如果 Tcl 端无法检测到,则可能会默认为 UTF-8。Web 代码通常为 Latin-1。
0赞 Rick James 4/17/2023
@DonalFellows - 我添加了更多。