例如,这是标准“按名称排序”查询返回的顺序:
name
------
Cebbb
Čebbc
Cebbd
我想按名称排序并首先获取重音字符,与其他重音字符分组,例如
name
------
Čebbc
Cebbb
Cebbd
默认情况下,MySql 将Č
其视为C
,出于排序目的,并按显示的顺序进行排序。
或者,有没有一种方法可以在 PHP 中“转换”Č
为C
用于比较目的?
SELECT k
FROM t1
ORDER BY k COLLATE utf8_spanish_ci;
然后,将使用正确的排序规则对列进行排序,并且列定义可以保持不变。
最简单的方法是对列本身应用适当的排序规则,例如:
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
...并选择更符合您期望的那个。手册中有简要说明。
要将带有重音符号或变音符号的特殊字符替换为普通拉丁字符,您可以使用 php 函数iconv
:
iconv("UTF-8", "ASCII//TRANSLIT", $text)
这会将变量$text
转换为纯 ASCII 字符。例如,müßig会被转换成muessig ,而caffée会被转换成caffee。
好的,这是我对不可否认的特殊情况的解决方案:
ORDER BY SUBSTRING(name, 1, 1),
BINARY SUBSTRING(name, 1, 1),
name
这当然不是最有效的查询——不过,在这种情况下,这并不是什么大问题——但它确实通过以下方式解决了我的问题:
Č
视为C
相同)Č
和C
这将在第一个字符之后进行非最佳排序,但这不是问题。