【发布时间】:2022-01-20 16:34:32
【问题描述】:
我的 MariaDB 表具有索引 VARCHAR(10) NOT NULL COLLATE 'utf8mb3_general_ci' 类型。我在 Go 中有一个字符串,如果它更长,我将其剪切为 10 个字符,以插入/更新此表。我把字符串剪成:
if len(value) > 10 {
value = value[:10]
}
现在我遇到了一个以š 字符结尾的字符串的问题。 MariaDB 抛出错误:Error 1366: Incorrect string value: '\\xC5'。查找 unicode 表,这个字符表示为 \xc5\xa1,这让我相信字符串的切割会以某种方式使字符串无法被数据库消化?
我想避免在我的代码中处理 utf8/unicode,因为这需要遍历所有数据库方法并处理所有字符串。而且我不认为这是必要的,因为我以前从未需要它。所以我认为问题出在其他地方,但不确定在哪里。
我尝试将排序规则切换为 utf8mb4_general_ci,但这也无济于事。
有趣的是,如果我直接使用 HeidiSQL 编辑列,则字符串保存得很好。这让我相信这可能是驱动程序问题。我一如既往地使用github.com/go-sql-driver/mysql。所以我不会期待问题,但是,谁知道......
【问题讨论】:
-
不正确的字符集。检查字符集设置 (
show variables like 'char%';)。 -
@Akina character_set_client、character_set_connection、character_set_results 是 utf8mb4 和 character_set_database、character_set_server、character_set_system 是 utf8mb3。这是正式的 mariadb 安装,一个月大,有一个 dev db。
-
Go 提供了另一种字符集,而不是 UTFx。更正 Go 设置或将 CONVERT() 应用于提供的数据。
-
@Akina Go 的字符串是 UTF8。没有什么可以转换的。
-
第一个字节为
0c5h的UTF8字符串?韩文音节?