hana数据库 字段长度_HANA-逻辑-字符集排序
研究结论
在我们的日常体验当中,SQL中汉字都是根据其拼音字母排序的,所以开始在编写自定义函数获取汉字拼音首字母时,便决定按照汉字的排序来赋值对应的拼音首字母。然而在实际运用的时候,却发现汉字并不是按照拼音来排序的,因此便对HANA中汉字的排序做了下研究。
网上查找资料时发现了一篇文章,其中说汉字在HANA数据库内部存储是按照十六进制编码存储的,排序也是按照此进行的。链接如下:https://blog.csdn.net/i042416/article/details/91351413
这边文章虽然看完还是懵逼,但终归有了些启发和方向,并且经过一番研究后最终得出以下结果:
在HANA数据库中,不仅只是汉字,还包括其他所有的字符,其底层逻辑 都按照 UNICODE UTF-8格式 存储的,且存储格式为二进制字符串格式 NCLOB,数据库排序也按照UNICODE UTF-8编码进行排序。
类推至其他数据库产品,也应该是类似的原理。
数字类型、日期类型,数据库中应该还有另外的处理逻辑,因为如 1,11,2 按照字符集编码的排序 是 1,11,2,而非我们认为的数字大小的排序1,2,11。
字符集说明
我们知道计算机底层是二进制的,那么计算机又是怎么将二进制转化为我们的认识的语言呢。此时需要引入了一个字符集的概念,这个字符集存储了我们日常使用到的所有符号,而对个符号进行编码,将编码存储至计算机,计算机通过调用编码来展现不用的语言文字。
类似我们在ERP实施过程中经常发现企业对一个物料会有多个编码一样,字符集编码也有多种,其大致分为三种:1、最基础的编码ASCII ;2世界各国自己的编码;3世界统一标准的国际码。
ASCII 编码:是最简单的西文编码方案。
GB2312、GBK、GB18030 是汉字字符编码方案的国家标准。
GB2312
GB2312编码是第一个汉字编码国家标准,其对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位,这种表示方式也称为区位码,GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE。
01-09区收录除汉字外的682个字符。
10-15区为空白区,没有使用。
16-55区收录3755个一级汉字,按拼音排序。
56-87区收录3008个二级汉字,按部首/笔画排序。
88-94区为空白区,没有使用。
我们要找的汉字拼音排序的就在这个字符集当中。
在GB2312标准基础上的内码扩展规范,向下兼容GBK2312.
现行国家标准,是我国计算机系统必须遵循的基础性标准之一。采用变长多字节编码,其对GB 2312-1980完全向后兼容,与GBK基本向后兼容,中华人民共和国境内所有软件产品都需要支持这个同时包含单字节、双字节和四字节编码的规格。
全球字符编码的国际标准。是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.
UTF-8、UTF-16、UTF-32是针对Unicode的可变长度字符编码的编码方式。Unicode为双字节字符集,即一个字符占2个字节,而UTF根据一定的规则,将其转化成单字节 、双字节、三字节等。以下为UTF-8转换说明。
第一种:Unicode从 0x0000 到 0x007F 范围的,标准ASCII码里面的内容,所以直接去掉前面那个字节 0x00,使用其第二个字节(与ASCII码相同)作为其编码,即为单字节UTF8。
第二种:Unicode从 0x0080 到 0x07FF 范围的,转换成双字节UTF8。
第三种:Unicode从 0x8000 到 0xFFFF 范围的,转换成三字节UTF8,一般中文都是在这个范围里。
第四种:超过双字节的Unicode目前还没有广泛支持,仅见emoji表情在此范围。
如前面引用博客里的 山东 ’’’\xE5\xB1\xB1\xE4\xB8\x9C’’’,其山 为 \xE5\xB1\xB1,则为三字节,每个字节为16进制数字可转换成8位2进制。
ANSI编码作为中国以及部分亚太地区的多字符编码格式,在windows操作系统或其他多语言版本的程序中有用到。比如使用简体中文语言的系统,ANSI即GBK;使用日文的系统,ANSI即日文编码。记事本中的编码格式有此编码格式。
目前一般的软件最常用UTF-8编码,有些软件不一定识别ANSI编码。如:安装目录不能有汉字;打开记事本文件显示乱码等。
实例说明
SAP中自定义表Code的排序问题
在SAP B1中自定义矩阵表,经常出现1,11,2自动排序的情况,是因为Code为系统内置char类型的字段,其按照UNICODE UTF-8字符集排序。因此我们在设置Code值时尽量不要用单纯的数字排列,建议用相同位数的数字或其他字符,如:001,002等。
SAP查询报表中的排序问题
由于字符集先天性设计的问题,汉字排序有可能出现不按照拼音排序的情况。
HANA SQL
汉字 山 和数字 1 的相关编码查询,由结果可知在HANA中UNICODE 默认编码方式为UTF-16编码。
select
'山' "字符",
STRTOBIN('山','ASCII') ,
STRTOBIN('山','GBK') ,STRTOBIN('山','GB2312'),STRTOBIN('山','GB18030'),
STRTOBIN('山','UNICODE') ,STRTOBIN('山','UTF-8') ,STRTOBIN('山','UTF-16')
from dummy
union all
select
'1',
STRTOBIN(1,'ASCII') ,
STRTOBIN(1,'GBK') ,STRTOBIN(1,'GB2312'),STRTOBIN(1,'GB18030'),
STRTOBIN(1,'UNICODE') ,STRTOBIN(1,'UTF-8') ,STRTOBIN(1,'UTF-16')
from dummy;
STRTOBIN.png
数字、字符以及数字UTF-8编码的排序测试。
select *
from(
select STRTOBIN(1,'UTF-8'),1,'1' from dummy
union all
select STRTOBIN(11,'UTF-8'),11,'11' from dummy
union all
select STRTOBIN(2,'UTF-8'),2,'2'from dummy
)
order by 1;
UTF-8.png
select *
from(
select STRTOBIN(1,'UTF-8'),1,'1' from dummy
union all
select STRTOBIN(11,'UTF-8'),11,'11' from dummy
union all
select STRTOBIN(2,'UTF-8'),2,'2'from dummy
)
order by 2;
数字.png
select *
from(
select STRTOBIN(1,'UTF-8'),1,'1' from dummy
union all
select STRTOBIN(11,'UTF-8'),11,'11' from dummy
union all
select STRTOBIN(2,'UTF-8'),2,'2'from dummy
)
order by 3;
字符.png
HANA相关函数
ASCII:返回ASCII字符对应的ASCII码值;ASCII('ASCII单字符')。
CHAR:返回ASCII码值对应的ASCII 字符;CHAR(ASCII值),值范围0--255。
NCHAR:返回整数对应的 unicode字符;NCHAR(ASCII值),值范围0--1114111。
STRTOBIN:将字符串中所有字符转换为 特定字符集对应的编码。STRTOBIN('字符串','字符集')。
BINTOSTR: 返回 VARBINARY 类型的串联对应的字符串。
文章来自于网络,如果侵犯了您的权益,请联系站长删除!