MySQL 默认字符集和排序规则(它们是服务器范围的,但可以根据连接进行更改)在创建表时应用。创建表后更改默认值不会影响现有表。
字符集和排序规则是各个列的属性。它们可以从表范围的默认值中设置,但它们确实属于列。
一个 utf8 字符集应该足以允许正确表示所有欧洲语言。您绝对应该能够将“a”和“±”存储为两个不同的字符。
utf8-bin 的排序规则产生区分大小写和重音字符的排序规则。
以下是文本值和整理行为之间差异的一些示例。我使用了三个示例字符串:'abcd'、'ĄBCD' 和 'ąbcd'。最后两个有 A-ogonek 字母。
第一个示例表明,使用 utf8 字符表示和 utf8_general_ci 排序规则,三个字符串分别按照用户指定的方式显示,但它们比较相等。在不区分 a 和 ± 的排序规则中,这是可以预料的。这是一个典型的不区分大小写的排序规则,其中所有变体字符的排序等于没有任何变音符号的字符。
SET NAMES 'utf8' COLLATE 'utf8_general_ci';
SELECT 'abcd', 'ąbcd' , 'abcd' < 'ąbcd', 'abcd' = 'ąbcd';
false true
下一个示例显示在不区分大小写的波兰语排序规则中,a 在 ą 之前。我不懂波兰语,但我怀疑波兰电话簿中的 As 和 Ą 是分开的。
SET NAMES 'utf8' COLLATE 'utf8_polish_ci';
SELECT 'abcd', 'ĄBCD' , 'ąbcd', 'abcd' < 'ĄBCD', 'abcd' < 'ąbcd' , 'ąbcd' = 'ĄBCD'
true true true
下一个示例显示了 utf8_bin 排序规则会发生什么。
SET NAMES 'utf8' COLLATE 'utf8_bin';
SELECT 'abcd', 'ĄBCD' , 'ąbcd', 'abcd' < 'ĄBCD', 'abcd' < 'ąbcd' , 'ąbcd' = 'ĄBCD'
true true false
在这种情况下,需要注意一件不直观的事情。'abcd' < 'ĄBCD' 为真(而纯 ASCII 的 'abcd' < 'ABCD' 为假)。如果你从语言上思考,这是一个奇怪的结果。这是因为两个 A-ogonek 字符在 utf8 中的二进制值都高于所有 abc 和 ABC 字符。所以:如果你对 ORDER BY 操作使用 utf8-bin 排序规则,你会得到语言上奇怪的结果。
您是说“Krąków”和“Kraków”比较相等,您对此感到困惑。当使用的排序规则是 utf8_general_ci 时,它们确实比较相等。但他们不使用 utf8_bin 或 utf8_polish_ci。根据 MySQL 对波兰语的支持,城市名称的这两种拼写是不同的。
当你设计你的应用程序时,你需要理清你希望这一切在语言上如何工作。“Krąków”和“Kraków”是同一个地方吗?“Ąaron”和“Aaron”是同一个人吗?如果是这样,您需要 utf8_general_ci。
您可以考虑更改显示的表格,如下所示:
ALTER TABLE Cities
MODIFY COLUMN city_Name
VARCHAR(145)
CHARACTER SET utf8
COLLATE utf8_general_ci
这将按照您想要的方式设置表格中的列。