MySQL: 在MySQL表中,两个不同的值被视为相同(无法设置唯一键)。
MySQL: 在MySQL表中,两个不同的值被视为相同(无法设置唯一键)。
我已经将我的小型MySQL表(手动减小以定位问题)转储到这里以展示:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; CREATE TABLE `symb` ( `smb` varchar(200) NOT NULL, `trtmnt` varchar(200) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `symb` (`smb`, `trtmnt`) VALUES ('і', 'ty'), ('ї', 'hr'); /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
如果您创建了上述MySQL表并运行此查询
select * from symb where smb = 'ї';
或者这个(查询是不同的 - 请查看符号 'ї' vs 'і')
select * from symb where smb = 'і';
那么您可能会看到选择了两行而不是我期望的一行。
再次强调,上述两个选择查询是不同的 - 符号 'ї' 与 'і' 是不同的(都是西里尔字母,'і' 在这里不是拉丁字母)。
选择的排序规则是utf8_general_ci
为什么 'і' 和 'ї' 被视为相同的符号,有什么正确的方法可以使它们不同?我需要选择确切的行,而不是两行。
上述查询在phpMyAdmin和HeidiSQL中进行了测试,这意味着这是MySQL(排序规则?)的问题,而不是用于运行查询的程序的问题。
每个不同的符号应被视为不同的符号,表应该区分大小写。上面的表有什么问题?结果是我无法为此行设置唯一键。
谢谢。
根据评论添加的内容:
SHOW TABLE STATUS LIKE 'symb' 显示了什么?
它显示:
名称 symb 引擎 InnoDB 版本 10 行格式 紧凑 行数 2 平均行长度 8192 数据长度 16384 最大数据长度 0 索引长度 0 数据可用空间 0 自动递增 NULL 创建时间 22.05.16 12:11 更新时间 NULL 检查时间 NULL 排序规则 utf8_general_ci 校验和 NULL 创建选项 注释
MySQL中出现两个不同的值被视为相同的问题的原因是由于使用了不正确的字符集和排序规则。默认情况下,MySQL使用utf8字符集,该字符集将一些特定字符视为相同,例如拉丁字母和西里尔字母。这导致了两个不同的字符被视为相同,无法设置唯一键。
要解决这个问题,可以采取以下步骤:
1. 确保数据库和表使用正确的字符集。可以使用utf8mb4字符集来支持更广泛的字符范围。可以通过修改MySQL配置文件中的字符集设置来完成。
2. 确保使用正确的排序规则。可以使用utf8mb4_unicode_ci或utf8mb4_general_ci排序规则来确保不同的字符被正确区分。
3. 确认每个列的字符集和排序规则是否正确设置。可以使用"SHOW CREATE TABLE"命令查看每个列的详细定义,以确保没有覆盖表级别的默认设置。
以下是一个示例解决方案:
-- 修改MySQL配置文件(my.cnf或my.ini) [mysqld] character-set-server=utf8mb4 -- 修改现有数据库的字符集和排序规则 ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改现有表的字符集和排序规则 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 确认每个列的字符集和排序规则是否正确设置 SHOW CREATE TABLE your_table_name;
通过以上步骤,您应该能够解决MySQL中两个不同的值被视为相同的问题,并且能够正确设置唯一键。
问题的原因是MySQL表中使用的字符集和排序规则(collation)导致两个不同的值被视为相同的。解决方法是选择适合语言的字符集和排序规则。
在这个对话中,问题的提出者遇到了字符集和排序规则的问题。他在第一条消息中提到了MySQL中的排序规则(collation)如何影响两个不同的值被视为相同。他提供了一个链接,指向了一个Stack Overflow的回答,这个回答提供了更多关于排序规则的信息。
他还问道,他是否应该选择utf8_unicode_ci作为推荐的表的排序规则,以及是否需要创建一个全新的表而不是转换现有表。他询问的两个问题都得到了肯定的回答。
在下一条消息中,提问者表示他按照建议从头开始使用utf8_unicode_ci排序规则,并解决了“ї”和“і”的问题。然而,他现在遇到了另一个类似的问题,即“ґ”和“г”的问题。他询问是否有任何解决办法。
然而,回答者表示他不知道如何解决这个问题,并建议提问者查看其他排序规则,并在线上查找关于最适合他所使用语言的排序规则的建议。
因此,这段对话提供了一个关于MySQL中字符集和排序规则导致两个不同的值被视为相同的问题的原因和解决方法。提问者遇到了类似的问题,并询问如何解决。回答者提供了一些建议和指导,但无法解决所有问题。