MySQL Collation: latin1_swedish_ci 和 utf8_general_ci区别

MySQL Collation: latin1_swedish_ci 和 utf8_general_ci区别

在MySQL中,Collation(排序规则)是控制字符串数据在比较和排序时使用的规则。Collation规则有很多种,但最常用的应该是latin1_swedish_ci和utf8_general_ci。那么这两种规则有什么不同呢?本文将对这两种常用的排序规则做详细的比较和说明。

阅读更多:MySQL 教程

latin1_swedish_ci

latin1_swedish_ci是MySQL默认的字符集,常用于Latin1编码的字符。它的排序规则是不区分大小写和重音符号,例如:

SELECT 'Café' = 'cafe' COLLATE latin1_swedish_ci; -- 结果为1
Mysql

在这个例子中,’Café’和’cafe’在排序规则latin1_swedish_ci下是相等的。因为该规则不区分大小写并且不区分重音符号。同时,对于一些特殊字符如‘ß’、‘Å’等,也可以在该规则下正确排序。

但是,在处理 Unicode 字符时,latin1_swedish_ci并不是一个好的选择。例如:

SELECT 'หมี' = 'หมา' COLLATE latin1_swedish_ci; -- 结果为1
Mysql

在这个例子中,’หมี’与’หมา’在排序规则latin1_swedish_ci下是相等的。显然这是不正确的。这是因为latin1_swedish_ci不能处理Unicode字符。这时我们就需要另外一种排序规则——utf8_general_ci。

utf8_general_ci

utf8_general_ci是一个Unicode字符集,可以处理Unicode字符,也可以处理ASCII字符。它的排序规则是不区分大小写和重音符号,同时考虑Unicode字符的异构性。例如:

SELECT 'Café' = 'cafe' COLLATE utf8_general_ci; -- 结果为1
SELECT 'หมี' = 'หมา' COLLATE utf8_general_ci; -- 结果为0
Mysql

在这两个例子中,utf8_general_ci可以正确处理大小写和重音符号,并且也可以处理Unicode字符。

除了utf8_general_ci,还有一种类似的排序规则——utf8_unicode_ci。不同于utf8_general_ci,utf8_unicode_ci会考虑字符的权值,因此在某些情况下可以更准确地排序。例如:

SELECT 'Ä' COLLATE utf8_unicode_ci = 'AE' COLLATE utf8_unicode_ci; -- 结果为1
SELECT 'ΐ' COLLATE utf8_unicode_ci = 'ï' COLLATE utf8_unicode_ci; -- 结果为1
SELECT 'ß' COLLATE utf8_unicode_ci > 's' COLLATE utf8_unicode_ci; -- 结果为1
Mysql

在这些例子中,我们可以看到utf8_unicode_ci会考虑字符的声调和其他权值,因此在一些特殊情况下可能更准确。

总结

总的来说,latin1_swedish_ci是传统的排序规则,适用于Latin1编码的字符,但不适用于Unicode字符。utf8_general_ci是Unicode字符集,适用于Unicode和ASCII字符,可以处理大小写和重音符号,并且还考虑了Unicode字符的异构性。utf8_unicode_ci更能考虑字符的权值,因此在某些情况下可以更准确地排序。

在实际使用中,应该根据具体情况选择合适的排序规则,以确保正确排序。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册