【发布时间】:2022-01-17 20:48:24
【问题描述】:
我的 java 服务将 MariaDB (10.3) 中的内容存储在数据库表中,使用 JPA 3 和 EclipseLink 作为 JPA 提供程序。数据库使用编码uft8mb4 和默认排序规则utf8mb4_general_ci。 RDBMS 配置为character-set-server = utf8mb4。
这是一个简单的表,映射到 DAO。
CREATE TABLE `directory_entries` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
`version` int(11) NOT NULL,
`name` varchar(250) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
到目前为止一切顺利。将字符串存储在 name 列中,然后再次检索实体可以正常工作:存储和获取 Unicode 字符。
现在,我发现,当按 name 列中的值查询条目时,"A " == "A",除非使用 no-pad 排序规则。将列的排序规则切换为 utf8mb4_general_nopad_ci 修复了空白比较,但不再存储未修改的 unicode 字符:“ü”变为“ü”。
这里发生了什么?我的理解是排序规则只在排序和比较中起作用,而不在存储和获取中起作用?!我如何存储和获取 unicode 字符串并在没有填充的情况下比较它们?
【问题讨论】: