甚至“ch”显示为两个字母,在捷克语中它被视为一个字母,其字母顺序在H字母后面(因此正确的顺序是a,b,c,d,e,f,g,h,ch ,我,j(我跳过一些国家字符)。但是当我这样做的时候 包含单词的列上的substr(colname,1,1)以ch开头只有“C”
这个sql:SELECT SUBSTRING(title,1,1)AS title_truncated FROM节点节点WHERE node.type in('termin')GROUP BY title_truncated ORDER BY title_truncated ASC“
返回:A,B,C,D,E,F,G,H,I,J(所以没有ch)。
btw数据库正在使用utf8_czech_ci
答案 0 :(得分:2)
Ch
本身不是Unicode中的字符,它是digraph。
因此,数据库排序规则似乎无法正确映射差异。 @Ladislav在评论中说,mySQL internals discussion,中的用户似乎支持这一点。
您可能需要手动解决此问题,例如:在您的示例中,使用IF
子句测试是否存在“Ch”,如果是这种情况则返回两个字符。
答案 1 :(得分:2)
即使ch
在捷克语中被视为单个排序“字母”,但它不会被视为任何其他方式的单个“字符”。无论何时遇到它,它都会被存储和打印成两个字符。
MySQL中的 collation 设置会影响字符串的排序方式,尝试对单个字符进行排序在许多语言中都没有多大意义。例如。 č
来自{IIRC} c
,但ně
和ne
是等效的,因此字词排序取决于以下字母。
我不明白你试图解决的根本问题,但我认为简单的方法可能是避免使用substring
并按title
排序,只输出第一个“字母”如果在处理结果时它发生了变化。
答案 2 :(得分:1)
作为一种变通方法,您可以像这样修改title_truncated
的定义:
CASE SUBSTRING(title, 1, 2)
WHEN 'ch' THEN SUBSTRING(title, 1, 2)
ELSE SUBSTRING(title, 1, 1)
END AS title_truncated