二.Atoms(基本数据类型)
预览
所有的数据最终都是通过基本数据类型构造出来的,所有我们从基本数据类型开始学习.一个基本数据类型是一个不可再分的带一个特定类型值的.q里的基本数据类型和传统的SQL有一部分协调,像日期,时间类型,时间序列.我们在下表中总结了出来,也给出了SQL在java和c#中的类型,我们将会在转换与枚举中讲到.
注意:在q中boolean,short,int等不是关键字,所有在文本中不会特别地显示.它们有特殊的意义当它们应用在操作的时候.你应该避免使用它们做命名.
下表中收集了每一个q数据类型的重要信息.我们将在后面提到它们.
整型数据
基本的整型数据类型几乎在所有的语言中都是一样.
整型
一个整型占有四个字节,一个numeric类型值被看作是一个整型,实际上仅仅包含numericdigits,possiblywithaleadingminussign,withoutadecimalpoint.在特殊情况,没有尾字符指示它是另一个数字类型,下面是一个典型的整型
短整型和长整型
另外两种整型是短整型和长整型.短整型占两个字节以'h'结尾,长整型以'j'结尾
重要:自动类型提升在q中是基本的操作.然而,如果一个特定的整型在list被用到和一个窄类型表现-如:如果需要一个整型但用短整型表示刚会发生错误(不能自动转),这可能是从C语言继承过来的,但是可能会在上文提到的表中产生误会.
浮点型数据
支持单精度和双精度的数据类型
浮点型
浮点型遵从IEEE标准占八位,在其它语言中可能被叫做双精度.以'f'结尾浮点型至少能存15位精度数.
如:
实型
实现是4四节的浮点型数据'e'结尾.在有些语言下实型被叫做是浮点型.它至少能保存6精度数,7是一个标准的实型,因而是一个有效的实型
提示:q控制台缩写了浮点型和实型后面的零
这种行为取代了不同宽度的浮点型类似于整型.
科学计算法
浮点型和实型都可以用IEEE标准的科学计数法来表示.
默认的,q控制台只显示出前七位有效有数学.
你可以改变,用\P命令(大写p)指定显示16位有效数字
二进制数据
二进制数据可以表示为位或者是字节
布尔型
布型用一个字节存储一个单独的位'b'结尾
字节
一个字节存储八位用'0x'表示一个十六进制数
二进制数是数字
处理二进制数的时候,q很像c语言,所有的二进制都被看作是无符号整型,所以能参与表达式运算或者是和其它数比较.没有true或者是false关键字,也不是逻辑操作符.像上面的a和pi.是一个整型是一个浮点型,自动类型提升.
字符型
在q中有两种原始字符类型.它比起高级语言中的字符类型更类似SQL中的CHAR和VARCHAR.
字符
一个字符型存储一个单一的ASCII码一个字节.和SQL中的CHAR符合.一个字符放在引号中.
一些键盘字符如双括号,不能直接输入,它在q中特殊的意思.像在C中,这些字符用\
处理.当控制台显示也包括escape,它们实际上是单一的字符.
你也可以escape一个字符用一个标的数表示三位八进制数
符号
一个符号类型保存了一系列的字符.用`开头
一个符号类型是不能复位的,意味着单独的字符组成的不能直接访问.符号类型经常性用来保存其它实体的名字.
重要:一个符号类型不是一个字符串.我们将会在lists一章中看到有一个跟字符串相似的,也就是一系列的字符.当一系列的字符组成一个符号类型的时候,我们强调一个符号类型不是由字符组成的.`a和"a"是不一样的.字符"q"和`kdb都有是原始的实体.
高级:你可能会问是否一个符号类型可以包括空格和特殊字符像`回答是可以的.你创建一个这样的符号通过一系列的字符和符号类型之间的关系.参看从字符串创建符号会有更详细的讲解.
注意:符号类型稍微有点类似SQL里的VARCHAR,所以能保存任意的字符.不同的是原始类型.字符"q"和符号`kdb都原子型实体.
时间型数据类型
一个主要的优势是q可以有效地,协调地,有风格地处理包括时间序列和关系数据.q继承了基础SQL的日期和时间数据类型促进时间的算法,whichisminimalinSQLandcanbeclumsyinverboselanguages(e.g.,Java'sdatelibraryanditsuseoftimezones).当开始处理与SQL相同的时间类型,在q中传统的时间类型分为日期和时间
日期
一个日期占四个字节格式为yyyy.mm.dd,yyyy指年,mm指月,dd指天.一个日期类型存储从2000年1月1日以来的天数.
重要:月份和天是从1开始所以一月是'01'.而不是0
月份天数中间的0不可以省略
高级:标地天数可以通过将日期转化为整来获得.
时间
占四个字节格式为hh:mm:ss.uuuh表示小时24小时制,m表现分钟,s表示秒,u表示毫秒.一个时间类型存储从午夜开始以来的毫秒数.
重复一次,0不能省略.
高级:毫秒可以通过将时间类型转为整型来得到
日期时间类型(datetime)
Datetime是日期和时间的组合类型,用ISO标准'T'格式来分开表示.datetime存储了从2000年1.1日午夜开始的天数.
高级:datetime实际保存的天数可以将其转化为float类型而得到
月类型(month)
月类型用四个字节存储格式为yyyy.mm用'm'结尾.一个月类型值存储了从年头开始的月份数
高级:month实际保存的月份数可以将其转化为整型而获得
分类型(minute)
分类型用四个字节格式为hh:mm一个分类型存储了从午夜开始的分钟数
注意:min在q中是保留字
高级:分类型实际保存的分分钟数可能通过将其转化为整来获得
秒类型(second)
秒类型用四个字节格式为hh:mm:ss一个秒类型存储了从午夜以来的秒数
秒类型的表示法看起来像每天的时间值,然而,一个q的时间值是从午夜开始计算的毫秒数,所以实际上它们值是不同的.
高级:通过将秒类型转化为整开始得到实际保存的秒数.但是会有不同情况
Constituents和圆括号
日期,时间,日期时间类型的要素可以用圆括号来取得.每个单独的域值都被都作一个int型来取得.日期型的域值分别叫年月日.
类似的,时间的域值叫做时分秒.
注意:在写这个文档的时候(Jun2007)还没有得到毫秒要素的语法,通过计算得到
除单独域外,你也可以得到higher-order的要素
当然,对于datetime类型也一样
高级:在q中有一个怪现象就是在函数中用圆括号访问时间要素是不行的,如
而是,转化为元素类型
无穷和NaN
除了规则的数字和时间类型值,特殊的值是无穷,指表示了它比一般的值都大
重要:注意大写W与小写w的区别
被零除的正的非零值结果为float无穷,表示为0w.被零除的负值表示为负的float无穷,表示为-0w.要记这个,可以想像一个w和∞.
在正常的整除法当中不能产生整型无穷值,结果一般是float.
被零除的0值,值为undefined,所有q语言表示float空值为0n.
在q的哲学中任何有效的算法表达式可以产生一个结果而不是一个错误,因此,被零除都得到一个特殊的浮点值而不是一个异常.你可以执行一个复杂的序列计算而不用担心中间的事和讨厌的异常.我们将可以在PrimitiveOperations(原始操作)里面了解到更多.
高级:无穷有参与运算.q在位模式上执行操作.数学家发现了以下的情况:
空值NullValues
空值的概念一般是指丢失数据.这是q与高级语言和SQL不同的地方.
在JavaC++和C#中,空值应到到复杂的实体中(例如,Objects),它们被指针或引用间接地访问.一个空值就像一个没有初始化的指针,意思是它还没有被分配地址和内存空间.简单类型没有空值的概念.在允许为空的类型中,你可测试一个值是否为空.
在SQL中空值是指不适用的或是丢失的意思.空值与其它任何类型不一样,它没有'='的说法.那就是说,你不能测试一个域null=NULL.而是,你可用看它是否为NULL.因为NULL是一个分开的值,Boolean域实际上有三个状态:0,1和NULL.
在q中,这种情况很有趣.每个类型都有自己的null值,有一些类型还没有指定null值的表示法
以下表格为现在已经归纳的类型的空值的总结:
二进制空值
让我们从二进制类型开始,就像你看到的,没有特殊的空值,意味着空值与零值相等.因此,你可能分不清一个丢失的boolean值与一个false之间的区别.
实际上,这不是问题,自从大多数应用不是criticaldistinction.如果你应用中的boolean的默认值flag不是零那可能就是一个问题,所有你必须保证这种情况不会发生.一个近似的防范就是用byte值.
数字和时间空值
接下来看数字和时间的空值.这里有种情况跟SQL里有点像,你可以区分从标地数据为0的丢失的数据.SQL中不同的是没有通用的空值.
在q中空值有一个优势就是它可以有equals的语法.但是作为折衷当你在类型检查的时候你必须使用正确的空值.
字符空值
最后我们来考虑一下字符型.鉴于symbol是字符的集合判断一个空的symbol,看一个symbol是否为空,空symbol表示为`
对比字符的空值,字符空值由""组成.在二进制数据中,你分不清丢失的char值和一个空白值.重申一次,中练习中没有什么限制,但是你得保证在实际应用中不能有这些问题.
注意:""值不是空的char.而是指一个char值里没有填入其它的值
<!--EndFragment-->