我不懂Collat​​ion?(Mysql,RDBMS,字符集)

Imr*_*ran 13 mysql sql sql-server oracle rdbms

我理解字符集,但我不理解校对.我知道你得到了Mysql或任何RDBMS中每个字符集的默认排序规则,但我仍然没有得到它!有人可以用外行的方式解释一下吗?

先感谢您 ;-)

Pek*_*ica 53

数据库排序规则的要点是确定数据的排序和比较方式.

字符串比较的区分大小写

SELECT "New York" = "NEW YORK";` 
Run Code Online (Sandbox Code Playgroud)

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

可以通过排序规则名称中的_ci_cs后缀来说明哪种排序规则._bin校对进行二进制比较(字符串必须100%相同).

变音符号/重音字符的比较

整理还确定在字符串比较中是否将重音字符视为其拉丁语基础对应物.

SELECT "Düsseldorf" =  "Dusseldorf";
SELECT "Èclair" =      "Eclair";
Run Code Online (Sandbox Code Playgroud)

在前一种情况下将返回真实; 后者是假的.您需要阅读每个排序规则的说明,以找出哪个是哪个.

字符串排序

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

例如,

  • 变音Ä Ö Ü是在芬兰/瑞典拼音字母结束latin1_swedish_ci

  • 它们被视为A O U德国DIN-1排序(latin_german1_ci)

  • AE OE UE德国DIN-2排序一样(latin_german2_ci).("电话簿"排序)

  • latin1_spanish_ci,"ñ"(n-tilde)是"n"和"o"之间的单独字母.

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

在运行时使用排序规则

您必须为表和列选择排序规则,但如果您不介意性能命中,则可以使用COLLATE关键字在运行时强制数据库操作进入某个排序规则.

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

SELECT name
FROM table
ORDER BY name COLLATE latin1_german2_ci;
Run Code Online (Sandbox Code Playgroud)

COLLATE在运行时使用会产生性能影响,因为在查询期间必须转换每列.因此,在应用此数据集之前请三思而后行.

MySQL参考:

  • +1,该死的好解释一个复杂的主题 (2认同)