如何将捷克“ch”字母存储在mysql中以及如何使用substr获取它?

时间:2011-03-12 09:41:56

标签: mysql sql collation

甚至“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

3 个答案:

答案 0 :(得分:2)

Ch本身不是Unicode中的字符,它是digraph

因此,数据库排序规则似乎无法正确映射差异。 @Ladislav在评论中说,mySQL internals discussion,中的用户似乎支持这一点。

您可能需要手动解决此问题,例如:在您的示例中,使用IF子句测试是否存在“Ch”,如果是这种情况则返回两个字符。

参考:utf8_czech_ci collation table (mySQL 6)

答案 1 :(得分:2)

即使ch在捷克语中被视为单个排序“字母”,但它不会被视为任何其他方式的单个“字符”。无论何时遇到它,它都会被存储和打印成两个字符。

MySQL中的 collat​​ion 设置会影响字符串的排序方式,尝试对单个字符进行排序在许多语言中都没有多大意义。例如。 č来自{IIRC} c,但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