如何在 MySQL 中创建带重音的索引

Posted

技术标签:

【中文标题】如何在 MySQL 中创建带重音的索引【英文标题】:how to create index with accent in MySQL 【发布时间】:2013-06-22 15:07:30 【问题描述】:

我有一个使用 phpMyAdmin 管理的数据库。 我有一个表格来保存verb tenseverb。它看起来如下:

Column | Type        | Collation         |  Attributes | Null | Default | Extra
-------+-------------+-------------------+-------------+------+---------+------
form   | varchar(50) | latin1_swedish_ci |             | No   |         |
verb   | varchar(50) | latin1_swedish_ci |             | Yes  | NULL    |

我创建并索引以获得更快的访问:

Keyname     | Type  | Unique | Packed | Column | Cardinality | Collation | Null | Comment
------------+-------+--------+--------+--------+-------------+-----------+------+--------
verbs_index | BTREE | Yes    | No     | form   | 1           | A         |      |
            |       |        |        | verb   | 1           | A         | YES  |

这样做的目的是在动词及其所有动词时态 (form) 之间建立关联,但是当我尝试插入带有重音的一对 (form,verb) 时,如果没有重音的形式已经存在。这些是与 mysql 相同的词,我得到了错误:

键“verbs_index”的重复条目“form-verb”。

我想插入:

insert into verbs values('o','verb1'); (without accent)
insert into verbs values('ó','verb1'); (with accent)

我一直在研究排序规则,我已经尝试过每个 latinutf8

【问题讨论】:

this post 有帮助吗?不要难过,你不是唯一一个遇到这个问题的人,这不是一个错误(虽然我觉得它的默认行为很奇怪,但仍然......) 【参考方案1】:

“不区分大小写”排序规则将比较字符串而忽略任何类型的变化。当然是case。但它也会忽略变音符号。例如,oOÔò 被认为是相等的。

要了解系统上可用的排序规则,请使用SHOW COLLATION

mysql> SHOW COLLATION;
+----------------------+----------+-----+---------+----------+---------+
| Collation            | Charset  | Id  | Default | Compiled | Sortlen |
+----------------------+----------+-----+---------+----------+---------+
[...]
| latin1_german1_ci    | latin1   |   5 |         | Yes      |       1 |
| latin1_swedish_ci    | latin1   |   8 | Yes     | Yes      |       1 |
| latin1_danish_ci     | latin1   |  15 |         | Yes      |       1 |
| latin1_german2_ci    | latin1   |  31 |         | Yes      |       2 |
| latin1_bin           | latin1   |  47 |         | Yes      |       1 |
| latin1_general_ci    | latin1   |  48 |         | Yes      |       1 |
| latin1_general_cs    | latin1   |  49 |         | Yes      |       1 |
| latin1_spanish_ci    | latin1   |  94 |         | Yes      |       1 |
| latin2_czech_cs      | latin2   |   2 |         | Yes      |       4 |
| latin2_general_ci    | latin2   |   9 | Yes     | Yes      |       1 |
| latin2_hungarian_ci  | latin2   |  21 |         | Yes      |       1 |
| latin2_croatian_ci   | latin2   |  27 |         | Yes      |       1 |
[...]

告诉你要将表格排序规则更改为latin1_general_cs_cs 区分大小写——以及大小写+重音等等):

mysql> ALTER TABLE verbs COLLATE latin1_general_cs;

【讨论】:

以上是关于如何在 MySQL 中创建带重音的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QOpenGLTexture 中创建带 alpha 的纹理?

如何在 django 中创建带参数的链接

如何在 Android 中创建带圆角的 ListView?

如何在React MUI中创建带标签的TextField

如何在 Swift 4 的 UIView 中创建带圆角的渐变边框

如何在 PySpark 中创建带偏移量的 InputDStream(使用 KafkaUtils.createDirectStream)?