Answers:
一般而言,Unicode变体之一可能是最广泛支持语言的一种-UTF-8将在每个代码点上使用更少的内存,因此,在您需要进行的任何时间/空间折衷中,它都将具有一点优势;但是,我认为UTF-8无法代表某些更深奥的语言/脚本(但我不确定100%,我还没有对此事进行详尽的研究)。
这篇Wikipedia文章可能会启发每个方面的弊端。
我认为上述问题(在2015-04-20,“哪个排序规则[]”)不是什么意思,因为公认的答案是关于编码而不是排序规则。让我回答陈述的问题而不是预期的问题,只是因为我认为这很有趣:-)
维基百科说“整理是将书面信息整理成标准顺序”。在计算中,核对采用“指定这样的顺序”的含义。换句话说,排序规则是(或暗示)三向比较函数的定义。
我认为简短的答案是“肯定可以”。至少我知道以下恶作剧:
#!/usr/bin/python
name = u"Jonas K\xf6lker" # \xf6 is o-umlaut
enc = name.encode('utf-8')
assert len(name) == 12 # \xf6 is one character
assert len(enc) == 13 # but two bytes in utf-8
import locale
locale.setlocale(locale.LC_COLLATE, "da_DK.utf8") # works on my machine
long_form = locale.strxfrm(enc)
assert len(long_form) == 38
locale.strxfrm
是一个函数Returns a string that behaves for cmp locale-aware
,也就是说,它对字符串进行编码,以使与按类似方式编码的另一个字符串进行逐字节标准词典编目比较将产生与根据语言环境指定的归类函数比较字符串相同的结果。
一些观察:在中da_DK.utf8
,对字符串ouüö
进行了排序。在中de_DE.utf8
,字符串oöuü
已排序。请注意,len(long_form) == 38
并且38>13。(长度也是38 in de_DE.utf8
。)
如果您的数据库在某个字符串字段上具有根据排序的索引da_DK.utf8
,则它可能在内部进行了类似strxfrm
的操作以进行简单比较。(另一方面,磁盘速度很慢。如果更高的每个字符的比较成本大于通过比较较少的字符所抵消的成本,则基于更紧凑的表示,索引可能会更快。)
您问“排序规则对查询速度有影响吗?”,我敢肯定答案是肯定的:“ C”(又名“ POSIX”)排序规则仅比较Unicode代码点值,而丹麦语(da_DK.utf8
)和德语(de_DE.utf8
)语言环境做起来比较棘手。这将对查询速度产生一些影响,尽管我怀疑这不会值得担心。
“表的大小是否根据排序规则而改变?” —我可以想象有一个索引根据一个排序规则,而另一个索引根据另一个排序规则,或者只是这两个索引之一,并strxfrm
应用了类似的转换。在这种假设的情况下,如果存在两个具有不同大小特征的排序规则,则答案为是。
“推荐的排序规则是什么?” —这取决于为什么需要对字符串进行排序。如果只是为了规范一些排序方式,我可能会选择“ C”。如果要按照人类的期望将数据按排序的顺序显示给用户,而这些期望是由他们的文化所决定的,并且您希望数据库(而不是其他某些层)进行排序,那么也许应该为每个整理建立一个索引,即,至少有一项da_DK.utf8
针对丹麦人,一项de_DE.utf8
针对德国人。我认为这可能很快就会变得相当大。
所有这些都高度依赖于数据库的内部工作原理。我认为它远远超出了“标准化”(大声笑!)SQL的范围。与往常一样,请查阅文档以了解特定的数据库系统。