一尘不染

我不了解整理?(MySQL,RDBMS,字符集)

mysql

我了解字符集,但不了解排序规则。我知道您对Mysql或任何RDBMS中的每个字符集都获得了默认的排序规则,但是我还是不明白!有人可以用外行术语解释吗?

先感谢您 ;-)


阅读 213

收藏
2020-05-17

共1个答案

一尘不染

数据库整理的重点是确定如何排序和比较数据。

字符串比较区分大小写

SELECT "New York" = "NEW YORK";`

对于不区分大小写的排序规则,将返回true;对于区分大小写的人为假。

排序规则名称中的_ci_cs后缀可以指示哪个排序规则。_bin归类进行二进制比较(字符串必须100%相同)。

变音/重音符号的比较

排序规则还确定在字符串比较中是否将重音字符视为其拉丁文基本对等物。

SELECT "Düsseldorf" =  "Dusseldorf";
SELECT "Èclair" =      "Eclair";

在前一种情况下将返回true;在后者中是错误的。您将需要阅读每个排序规则的描述以找出哪个是哪个。

字符串排序

排序规则会影响字符串的排序方式。

例如,

  • 芬兰语Ä Ö Ü/瑞典语字母中的字母结尾latin1_swedish_ci

  • 它们按照A O U德国DIN-1分类(latin_german1_ci)处理

  • 并按照AE OE UE德国DIN-2分类(latin_german2_ci)。(“电话簿”排序)

  • 在中latin1_spanish_ci,“ñ”(n-波浪号)是“ n”和“ o”之间的单独字母。

当使用非拉丁字符时,这些规则将导致不同的排序顺序。

在运行时使用归类

您必须为表和列选择排序规则,但是如果您不介意性能下降,则可以在运行时使用COLLATE关键字将数据库操作强制为某种排序规则。

这将使用德国DIN-2排序规则tablename列进行排序:

SELECT name
FROM table
ORDER BY name COLLATE latin1_german2_ci;

COLLATE在运行时使用会影响性能,因为在查询过程中必须转换每一列。因此,在应用大型数据集之前,请三思而后行。

MySQL参考:

2020-05-17