问题:如何在MySQL中对瑞典字符Å Ä Ö进行排序?

11

我正在尝试根据用户选择对列表进行升序或降序排序。在列表中,我有瑞典字符Å Ä Ö,这是问题出现的地方。我有以下列表:

(First list)
Stängd
Stängd
Öppen
Krävs ej
Krävs ej

(代表:Stängd = 关闭,Öppen = 开启,Krävs ej = 不需要)

该列表应根据用户选择进行排序;

Öppen
Stängd
Stängd
Krävs ej
Krävs ej
或者
Krävs ej 
Krävs ej
Stängd 
Stängd 
Öppen 

但目前第一个列表显示出来了。问题在于 "Ö" 这个字符。我的数据库和字段都使用 utf8_general_ci 校对规则,所以这不是问题。而且 "Ö" 这个字符在数据库中是正确的(通过 PHPMyAdmin 查看),并且在打印输出时也是正确的。

我的代码如下:

$querystr = "
    SELECT wposts.*
    FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta
    WHERE wposts.ID = wpostmeta.post_id
    AND wpostmeta.meta_key = '$sort_by'
    AND wposts.post_type = 'sida'
    AND wposts.post_status = 'publish'
    ORDER BY wpostmeta.meta_value $sort_order";

这是为什么?如何解决?


1
我认为在瑞典字母表中,带分音符的字母o位于字母表的末尾。 - Elzo Valugi
3个回答

26
但实际上是这样的。:) 不同的排序规则和处理变音符号的方式不同。 utf8_general_ci 会将 Ö 排序为 O。请尝试使用 utf8_swedish_ci,它将具有正确的排序顺序,即(我记得)ÄAÖ 排在字母表的末尾。
有关背景信息,请参见 9.1.7.8. 排序效果示例

2
太棒了!那就解决了问题。我错了。每天都会学到新东西。再次感谢! - Fredrik
3
虽然我已经知道了瑞典语排序法可以解决排序问题,但我并没有意识到需要重新填充表格才能使其生效。在确认了这个解决方案后,我尝试了这个方法,结果成功了。 - jpeltoniemi
2
不需要重新填充表格。但是可能需要更改列上的排序规则。 - larsemil

7

general collation(通用排序规则)将 Ö 排在 O 前面。如果您希望 Ö 排在字母表的末尾,则需要使用utf8_swedish_ci(瑞典语排序规则)。


4

如果您想将现有的表转换为新的排序规则,请使用以下方法:

alter table [tableName] convert to character set utf8 collate utf8_swedish_ci;

1
请参见 https://dev59.com/S7bna4cB1Zd3GeqPYk20。 - Mad Marvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接