• 09月29日 星期日

DRF中Ordering名称按gbk编码排序

前言

最近可把阿毛急坏了。。。

测试:项目经理在吗?咱们的排序有问题啊?不是按照1,2····数字之后a,b·····汉字这样的排序规则啊????

项目经理:是吗?我看看,顺便把阿毛叫过来,emm......

阿毛:什么事情老大?

项目经理:你看看咱们的项目排序不对啊?是哪里出了问题?

阿毛:我看看(愤怒的眼神看着测试在操作。。。别拦我,给我一把刀。。。)

项目经理:看出来哪里的问题了吗?

阿毛:哦哦,似乎是出了点小问题。

测试:幸灾乐祸的在一旁。

项目经理:今晚加个班,修改一下吧。

阿毛:本来今晚回去约妹子逛街呢,这。。。脱单的道路总是坎坷不平。。。

DRF中Ordering名称按gbk编码排序

进展

阿毛回到工位疯狂查看原因,什么?编码导致的,可是mysql默认就是这个排序规则啊,怎么修改。

正在阿毛百思不得其解的时候,微信有一条消息。。。

阿花:今晚可别迟到啊,,,

阿毛心中焦躁不安,放到明天再做???不行,这样的话阿毛的项目奖金又该不发了,阿毛打开微信犹豫半天,

阿毛:不好意思阿花,我今晚身体不舒服,能改天再约吗?

见妹子没有说话,阿毛又说了一句,

阿毛:下次一定准时。

什么???对方开启了朋友验证,你还不是他的朋友,请验证身份。。。。

本来上天给阿毛一个摆在身边的机会,可是阿毛有没有抓住。。。。

DRF中Ordering名称按gbk编码排序

事情的经过就是这样的,先话不多说,赶紧上教程,赶快让阿毛脱单吧。。。

了解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个造字码位,简、繁体字融于一库。

DRF中Ordering名称按gbk编码排序

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

好了,希望能帮到这条单身狗。。。顺便送给阿毛一个照片女友安慰一下。。。

DRF中Ordering名称按gbk编码排序

上一篇新闻

这种信用证你见过吗这种信用证能读懂并准确理解其中的每项条款吗

下一篇新闻

初入新加坡jcu大学,这些事情你最好提前知道

评论

订阅每日新闻

订阅每日新闻以免错过最新最热门的新加坡新闻。