6

例如,这是标准“按名称排序”查询返回的顺序:

name
------
Cebbb
Čebbc
Cebbd

我想按名称排序并首先获取重音字符,与其他重音字符分组,例如

name
------
Čebbc
Cebbb
Cebbd

默认情况下,MySql 将Č其视为C,出于排序目的,并按显示的顺序进行排序。

或者,有没有一种方法可以在 PHP 中“转换”ČC用于比较目的?

4

4 回答 4

8

您可以在子句中添加COLLATE表达式ORDER BY

SELECT k
FROM t1
ORDER BY k COLLATE utf8_spanish_ci;

然后,将使用正确的排序规则对列进行排序,并且列定义可以保持不变。

于 2012-05-04T10:31:03.717 回答
2

最简单的方法是对列本身应用适当的排序规则,例如:

CREATE TABLE foo (
    foo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL COLLATE 'utf8_spanish_ci',
    PRIMARY KEY (`foo_id`)
)
COLLATE='utf8_spanish_ci'
ENGINE=InnoDB;

更新:

Č不是西班牙字母:

在克罗地亚语、斯洛文尼亚语、波斯尼亚语、Skolt Sami 和 Lakota 字母表中,它是字母表的第四个字母。在捷克语、北萨米语字母表以及波罗的海语言立陶宛语和拉脱维亚语中,该字母排在 第五位。在斯洛伐克语中,它是字母表的第六个字母。它也用于普什图语(相当于 چ‎)和萨尼奇语。

与数字不同,字母没有固定的绝对顺序。字母顺序的整个概念是相对的——你必须首先选择一个规则集。运行此 SQL 查询以了解您的 MySQL 服务器中有哪些可用:

SHOW CHARACTER SET

...并选择更符合您期望的那个。手册中有简要说明

于 2012-05-04T10:16:13.080 回答
0

要将带有重音符号或变音符号的特殊字符替换为普通拉丁字符,您可以使用 php 函数iconv

iconv("UTF-8", "ASCII//TRANSLIT", $text)

这会将变量$text转换为纯 ASCII 字符。例如,müßig会被转换成muessig caffée会被转换成caffee

于 2012-05-04T11:14:58.750 回答
0

好的,这是对不可否认的特殊情况的解决方案:

ORDER BY SUBSTRING(name, 1, 1),
         BINARY SUBSTRING(name, 1, 1),
         name

这当然不是最有效的查询——不过,在这种情况下,这并不是什么大问题——但它确实通过以下方式解决了我的问题:

  1. 按初始字符排序(MySql 会将其Č视为C相同)
  2. 然后按初始字符的二进制值排序,这将区分ČC
  3. 然后按全名排序,这实际上将按字符串的其余部分排序。

这将在第一个字符之后进行非最佳排序,但这不是问题。

于 2012-05-04T12:08:57.623 回答