在MySQL中使用重音敏感主键

qij5mzcb  于 2023-08-02  发布在  Mysql
关注(0)|答案(3)|浏览(109)

所需结果:

在MySQL中具有区分重音的主键。
我有一个独特的单词表,所以我使用单词本身作为主键(顺便说一句,如果有人能给予我一个关于它的建议,我不知道这是否是一个好的设计/实践或没有)。
我需要该字段区分重音(为什么不区分大小写),因为它必须区分'demandé''demande',这是法语动词“demander”的两个不同的变音。我没有任何问题,以存储重音字在数据库中。我只是不能插入两个重音字符串时,是相同的,而非重音。

错误:

尝试使用以下查询创建'demandé'行时:

INSERT INTO `corpus`.`token` (`name_token`) VALUES ('demandé');

字符串
我得到这个错误:

ERROR 1062: 1062: Duplicate entry 'demandé' for key 'PRIMARY'

问题:

  • 为了在该表中为“demande”和“demandé”提供两个不同的唯一主键,a应该在过程中的哪个位置进行修改?
    解决方案using 'collate utf8_general_ci'在表中声明
  • 如何进行区分重音的查询?是下面的正确方法:SELECT * FROM corpus.token WHERE name_token = 'demandé' COLLATE utf8_bin
    解决方案使用WHERE语句的using 'collate utf8_bin'
  • 我发现我可以通过使用BINARY关键字来实现这一点(请参见此sqlFiddle)。collatebinary之间有何区别?
  • 是否可以保留其他表以避免任何更改?(无论如何,我都必须重建该表,因为它有点乱)
  • 我对MySQL中的编码不是很满意。我在数据库中的编码还没有任何问题(我很幸运,因为我的数据可能不总是使用相同的编码...我对此无能为力)。我有一种感觉,任何关于“重音敏感”问题的修改都可能会在其他查询或数据完整性方面产生一些编码问题。我有必要担心吗?

循序渐进:

数据库创建:

CREATE DATABASE corpus DEFAULT CHARACTER SET utf8;


唯一字词表:

CREATE TABLE token (name_token VARCHAR(50), freq INTEGER, CONSTRAINT pk_token PRIMARY KEY (name_token))


查询

SELECT * FROM corpus.token WHERE name_token = 'demande';
SELECT * FROM corpus.token WHERE name_token = 'demandé';


两者都返回相同的行:

demande

6tqwzwtp

6tqwzwtp1#

排序规则。你有两个选择,而不是三个:

utf8_bin将所有这些都视为 * 不同 *:demandédemandeDemandé
utf8_..._ci(通常是utf8_general_ciutf8_unicode_ci)将所有这些都视为“相同”:demandédemandeDemandé
如果您只想区分大小写(demandé = demande,但两者都不匹配Demandé),那么您就不走运了。
如果您只想要重音敏感度(demandé = Demandé,但两者都不匹配demande),那么您就不走运了。

声明。最好的方法是做任何你选择的事情:

CREATE TABLE (
    name VARCHAR(...)  CHARACTER SET utf8  COLLATE utf8_...  NOT NULL,
    ...
    PRIMARY KEY(name)
)

字符串

不要动态更改排序规则。如果name中的排序规则不同,则不会使用索引(也就是说,会很慢):

WHERE name = ... COLLATE ...

BINARY。* 数据类型 * BINARYVARBINARYBLOB非常类似于CHARVARCHARTEXTCOLLATE ..._bin。也许唯一的区别是,文本将被检查是否有效的utf8存储在VARCHAR ... COLLATE ..._bin中,但当存储到VARBINARY...中时不会被检查。* 比较 *(WHEREORDER BY,etc)将是相同的;也就是说,简单地比较位,不做大小写折叠或重音剥离等。

5lhxktic

5lhxktic2#

也许你需要这个
排序规则名称中的_ci =不区分大小写
如果对该字段的搜索总是区分大小写,则将该字段的排序规则声明为utf8_bin...它会比较utf8编码的字节是否相等。
第一个月
如果搜索通常不区分大小写,但您希望对此搜索例外,请尝试;
WHERE col_name = 'demandé' collate utf8_bin
More here

ve7v8dk2

ve7v8dk23#

试试这个

mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t1
-> (c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t1 VALUES ('a'),('A'),('À'),('á');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+
| c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |
+------+---------+------------------------+
| a    | 61      | 0041                   |
| A    | 41      | 0041                   |
| À    | C380    | 0041                   |
| á    | C3A1    | 0041                   |
+------+---------+------------------------+
4 rows in set (0.00 sec)

字符串

相关问题