前言
最近可把阿毛急坏了。。。
测试:项目经理在吗?咱们的排序有问题啊?不是按照1,2····数字之后a,b·····汉字这样的排序规则啊????
项目经理:是吗?我看看,顺便把阿毛叫过来,emm......
阿毛:什么事情老大?
项目经理:你看看咱们的项目排序不对啊?是哪里出了问题?
阿毛:我看看(愤怒的眼神看着测试在操作。。。别拦我,给我一把刀。。。)
项目经理:看出来哪里的问题了吗?
阿毛:哦哦,似乎是出了点小问题。
测试:幸灾乐祸的在一旁。
项目经理:今晚加个班,修改一下吧。
阿毛:本来今晚回去约妹子逛街呢,这。。。脱单的道路总是坎坷不平。。。
进展
阿毛回到工位疯狂查看原因,什么?编码导致的,可是mysql默认就是这个排序规则啊,怎么修改。
正在阿毛百思不得其解的时候,微信有一条消息。。。
阿花:今晚可别迟到啊,,,
阿毛心中焦躁不安,放到明天再做???不行,这样的话阿毛的项目奖金又该不发了,阿毛打开微信犹豫半天,
阿毛:不好意思阿花,我今晚身体不舒服,能改天再约吗?
见妹子没有说话,阿毛又说了一句,
阿毛:下次一定准时。
什么???对方开启了朋友验证,你还不是他的朋友,请验证身份。。。。
本来上天给阿毛一个摆在身边的机会,可是阿毛有没有抓住。。。。
事情的经过就是这样的,先话不多说,赶紧上教程,赶快让阿毛脱单吧。。。
了解GBK编码
GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。
GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中e69da5e6ba907a686964616f31333363353864文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
MySQL默认排序规则
mysql默认varchar类型是对大小写不敏感(不区分),如果想要mysql区分大小写需要设置排序规则:
utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感。
用utf8_genera_ci没有区分大小写,导致这个字段的内容区分大小写时出问题,比如作为区分大小写的code或者验证码时就出问题了。
utf8_general_cs这个选项一般没有,所以只能用utf8_bin区分大小写。
1)设置排序规则是可逆的,如果之前设置的排序规则不符合,更换排序规则后,可能出现乱码,当再次恢复原来的排序规则后,乱码即消失。
2)可以将varchar 类型改为 varbinary
3)如果已经使用了默认的排序规则,即utf8_genera_ci,而又想查询结果大小写区分,可以在查询时进行限定:select binary column from table; 或者 select column2 from table where binary cloumn;
MySQL中GBK编码排序
在mysql数据库中可以使用GBK编码对中文进行排序,如名字按首字母排序
order by convert(substr(tu.username,1,1) using 'GBK')
其中substr方法截取第一个字母也就是姓氏,然后转成GBK编码进行排序
DRF中Ordring按GBK编码
下面代码是阿毛个人理解的,如果有改进的地方请大神们指点。
class Convert(Func): def __init__(self, expression, transcoding_name, **extra): super(Convert, self).__init__( expression, transcoding_name=transcoding_name, **extra ) def as_mysql(self, compiler, connection): self.function = "CONVERT" self.template = "%(function)s(%(expressions)s USING %(transcoding_name)s)" return super(Convert, self).as_sql(compiler, connection)class NameOrdering(OrderingFilter): def filter_queryset(self, request, queryset, view): ordering = self.get_ordering(request, queryset, view) if ordering: for i in ordering: if i == "name": ordering.remove(i) queryset = queryset.order_by(Convert("name", "gbk").asc()) return queryset elif i == "-name": ordering.remove(i) queryset = queryset.order_by(Convert("name", "gbk").desc()) return queryset return queryset.order_by(*ordering) return queryset
好了,希望能帮到这条单身狗。。。顺便送给阿毛一个照片女友安慰一下。。。