Mysql中的UTF-8字符集与字符集排序规则的选择

Mysql中的UTF-8字符集与字符集排序规则的选择,第1张

    标准的UTF-8 字符集编码,是可以用 1~4 个字节去编码21位字符,是一种变长的编码格式,这几乎包含了是世界上所有能看见的语言了。

    然而在MySQL里实现的utf8最长使用3个字节,节省空间但不能表达全部的UTF-8,只支持到了 Unicode 中的“基本多文种平面”(U+0000至U+FFFF,Basic Multilingual Plane,BMP),但并不是所有。现在手机端常用的表情字符 emoji和一些不常用的汉字需要四个字节才能编码出来。

    MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4,使用4个字节来表示完整的UTF-8,是utf8 的超集并完全兼容utf8,能够用4个字节存储更多的字符。

utf8mb4_bin: 将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。

utf8mb4_general_ci :不区分大小写,不支持扩展,它仅能够在字符之间进行逐个比较,没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。

utf8mb4_unicode_ci :是基于标准的unicode来排序和比较,能够在各种语言之间精确排序,unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

_bin : binary case sensitive collation,区分大小写的

_cs : case sensitive collation,区分大小写

_ci : case insensitive collation,不区分大小写

    主要从排序准确性和性能两方面看:

参考链接: https://www.cnblogs.com/qingfengEthan/p/11326741.html

请参考下列排序方式,权作抛砖引玉。

如果一杠左边只有一位数

select a from t1 order by left(a,1) asc,

cast(mid(a,3) as int) asc

如果一杠左边的数字位数是不固定的

select a from t1 order by

cast(left(a,length(a)-instr(a,'-')) as int) asc,

cast(mid(a,instr(a,'-')+1) as int) asc

你的“中文”是固定的文字吗?

--下面的语句只支持9999以下的数字排序

select id,col, right(col,length(col)-LEAST(

    if(Locate('0',col) >0,Locate('0',col),9999),

    if(Locate('1',col) >0,Locate('1',col),9999),

    if(Locate('2',col) >0,Locate('2',col),9999),

    if(Locate('3',col) >0,Locate('3',col),9999),

    if(Locate('4',col) >0,Locate('4',col),9999),

    if(Locate('5',col) >0,Locate('5',col),9999),

    if(Locate('6',col) >0,Locate('6',col),9999),

    if(Locate('7',col) >0,Locate('7',col),9999),

    if(Locate('8',col) >0,Locate('8',col),9999),

    if(Locate('9',col) >0,Locate('9',col),9999)

  )-1) *1 a

   from test4 order by a


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6098459.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存