提问人:Miguel Frias 提问时间:4/17/2023 更新时间:4/17/2023 访问量:42
Tcl,数据库插入 mysqlexec/db 服务器:字符串值不正确:
Tcl, database insertion mysqlexec/db server: Incorrect string value:
问:
几年来,我有一个奇怪的问题。事情是这样的。
我运行 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 兼容,无需转换
答:
\xE1
听起来像 Latin1,绝对不是 UTF8。然后连接,设置客户端的字符集编码。或者,连接后使用。SET NAMES latin1;
E1 是以下任何一种情况下 á 的十六进制:cp1250、dec8、latin1、latin2、latin5。
C3A1 是 utf8 / utf8mb4 中的下一个。
至于“数据库中的数据是否......”......
- 在数据库中使用 utf8mb4 可以表示世界上的所有字符集,包括表情符号。
- 通过正确的配置,MySQL很乐意在INSERTing/SELECTing时与UTF-8相互转换。目标字符集(在客户端中)基本上可以是任何编码。拉丁语 1 很常见;除了普通的 ASCII 字母、数字和简单的标点符号外,它还有大约 120 个额外的字符(重音字母和常用符号)。
列定义控制数据库中存储的内容。
连接参数指定客户端的字符集。
评论
mysql Ver 8.0.30 for Linux
当您提到 MariaDB 时,看起来像客户端版本。如果它真的 MariaDB 包括 MariaDB 版本 .一般问题是 tcl 需要以某种方式使用 utf8mb4 字符集作为连接选项进行连接。 也许就像 SQL 一样。select version()
set names utf8