精华内容
下载资源
问答
  • Redis五种数据类型

    万次阅读 多人点赞 2018-06-07 21:38:32
    乐观锁:心很大,每次去拿数据的时候都不认为别人会修改,在取数据的时候不会加锁,乐观锁可以理解为一检测机制,只是在更新数据的时候会判断一下别人是否已经修改了,如果已经修改了就放弃此次的更新操作,进行重试。...

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan

    Redis简介

    在没有redis之前,客户端访问后端应用时,当并发大的时候,存储层如mysql是支撑不了的,可能会将存储层mysql压死,存储层一旦宕机,整个应用就完了。为了很高效的加速应用的读写速度,同时也可以降低后端负载在一定程度上可以通过AOF和RDB机制保证在一定的情况下(如缓存层宕机)快速恢复数据为应用提供服务。缓存层可以通过主从复制+哨兵或集群实现高可用。Redis(REmote DIctionary Server)是一个开源的使用ANSI C语言编写的基于内存亦可持久化的日志型,key-value数据库,并提供了多种语言。它通常被称为数据结构服务器,因为值可以是string,hash,list,set,zset. Redis采用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,在单线程的架构下为什么能如此快呢?主要有四点原因:①redis的所有数据是存放在内存中的②redis是C语言实现的,C语言实现的程序距离操作系统更近③Redis使用了单线程架构,预防了多线程可能产生的竞争问题,例如,CPU频繁切换,资源竞争等问题。④Redis源代码非常少,可以说是精打细磨的。 ![这里写图片描述](https://img-blog.csdn.net/20180607205750524?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

    基本数据结构

    **1.字符串(String):** 可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB ![这里写图片描述](https://img-blog.csdn.net/20180607202339870?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    • 命令
      添加元素
    //ex:秒级过期时间,nx:键不存在时才能设置成功,xx键存在时才能设置成功
    set key value [ex seconds] [px milliseconds] [nx|xx]
    

    获取值

    get key
    

    批量设置值

    mset key value [key value ...]
    mset a 1 b 2 c 3 d 4
    

    批量获取值

    mget key [key ...]
    mget a b c d
    

    计数

    incr key
    

    追加值

    append key value
    

    字符串长度

    strlen key
    

    设置并返回原值

    getset key value
    

    设置指定位置的字符

    setrange key offeset value
    //例子
     set redis pest
     setrange redis 0 b
     get redis
     结果:"best"
    

    获取部分字符串

    getrange key start end
    
    • 内部编码
      i. int 长整型
      ii. embstr 短字符(<=39字节)
      iii. raw 长字符(>39)
    • 使用场景
      i. 缓存
      这里写图片描述
    //  定义键
    userRedisKey = "user:info:" + id;
    //  从 Redis 获取值
    value = redis.get(userRedisKey);
    if (value != null) {
    //  将值进行反序列化为 UserInfo 并返回结果
    userInfo = deserialize(value);
    return userInfo;
    }
    

    ii. 计数:点赞,视频播放量,每播放一次就+1

    long incrVideoCounter(long id) {
    key = "video:playCount:" + id;
    return redis.incr(key);
    }
    

    iii. 接口防刷:验证码登录,公司一般的验证码等发短信功能都是调用的第三方接口,如果被有心之人利用了,会给公司造成一定的损失,所以简单的解决方法就是限流

    phoneNum = "138xxxxxxxx";
    key = "shortMsg:limit:" + phoneNum;
    // SET key value EX 60 NX
    isExists = redis.set(key,1,"EX 60","NX");
    if(isExists != null || redis.incr(key) <=5){
    //  通过
    }else{
    //  限速
    }
    
    **2.哈希(hash):**哈希类型是指键值本身又是一个键值对结构,value={{field1,value1},...{fieldN,valueN}} ![这里写图片描述](https://img-blog.csdn.net/20180607210008695?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poMTU3MzI2MjE2Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    • 命令
    //设置值
    hset key field value
    
    //获取值
    hget key field
    
    //删除field
    hdel key field [field ...]
    
    //计算field个数
    hlen key
    
    //批量设置或获取field-value
    hmset key field value [field value ...]
    hmget key field [field ...]
    
    //判断field是否存在
    hexists key field
    
    //获取所有field
    hkeys key
    
    //获取所有value
    hvals key
    
    //获取所有的field-value
    hgetall key
    
    //以某种形式自增
    hincrby key field
    hincrbyfloat key field
    
    //计算value的字符串长度
    hstrlen key field
    
    • 内部编码
      i. ziplist:当field个数不超过hash-max-ziplist-entries(默认为512个)时,并且没有大value(64个字节以上算大)
      ii. hashtable:ziplist的两个条件只要有一个不符合就会转换为hashtable
    • 使用场景
      i. 存储用户信息
      § 原生string:直观,占用键多
      § 序列化字符串:序列化后好操作,每次都需要反序列化和序列化所有字段
      § 哈希类型:简单直观,减少内存空间的使用

      **3.列表(list)😗*用来存储多个有序的字符串,列表中的每个字符串称为元素(element),一个列表最多可以存储2^32 -1个元素
      这里写图片描述
    • 命令
    //从右边插入元素
    rpush key value [value ...]
    
    //从左边插入元素
    lpush key value [value ...]
    
    //向某个元素前或者后插入元素
    linsert key before|after pivot value
    
    //获取指定范围内的元素列表
    lrange key start end
    
    //获取列表指定索引下标的元素
    lindex key index
    
    //获取列表长度
    llen key
    
    //从列表左侧弹出元素
    lpop key
    
    //从列表右侧弹出
    rpop key
    
    //删除指定元素,count>0从左到右,count<0从右到左,count=0,删除所有
    lrem key count value
    
    //按照索引范围修剪列表
    ltrim key start end
    
    //修改指定索引下标的元素:
    lset key index newValue
    
    //阻塞式弹出
    //列表为空,则按照设置的timeout值进行阻塞
    //列表不为空,则会立即返回
    blpop key [key ...] timeout
    brpop key [key ...] timeout
    
    • 内部编码
      i. ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置
      (默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时
      (默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使
      用。
      ii. linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用
      linkedlist作为列表的内部实现。
    • 使用场景
      i. 消息队列:Redis的lpush+brpop命令组合即可实现阻塞队列

      **4.集合(set)😗*用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
      这里写图片描述
    • 命令
      添加元素
    sadd key element ...
    sadd myset a b c
    

    删除元素

    srem key element [element ...]
    //返回成功删除元素个数
    srem myset a b
    

    计算元素个数

    scard key
    

    判断元素是否在集合中

    sismember key element
    

    随机从集合返回指定个数元素

    srandmember key [count]
    

    从集合随机弹出元素

    spop key
    

    获取所有元素

    smembers key
    

    多个集合求交集

    sinter key [key ...]
    

    多个集合求并集

    suinon key [key ...]
    

    求多个集合的差集

    sdiff key [key ...]
    

    将交集、并集、差集的结果保存

    sinterstore destination key [key ...]
    suionstore destination key [key ...]
    sdiffstore destination key [key ...]
    
    • 内部编码
      i. intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-
      intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实
      现,从而减少内存的使用。
      ii. hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使
      用hashtable作为集合的内部实现。
    • 使用场景
      i. 给用户添加标签
    sadd user:1:tags tag1 tag2 tag5
    

    ii.抽奖
    生成随机数,集合不能存放相同的元素,因此随机pop出一个元素,可以作为中奖的号码
    iii. 社交需求:可以给用户推荐有相同兴趣的人,用于交友。

    **5.有序集合(zset)😗*不能有重复的元素,而且还可以排序,它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据
    这里写图片描述

    • 命令
      添加成员
    zadd key score member
    zadd user:ranking 251 tom
    

    计算成员个数

    zcard key
    zcard user:ranking
    

    计算某个成员的分数,如果成员不存在,则返回nil

    zscore key member
    zscore user:ranking tom
    

    计算成员的排名,zrank是分数从低到高,zrevrank从高到低

    zrank key member
    zrevrank key member
    

    删除成员

    zrem key member
    //将成员mike从有序集合user:ranking中删除
    zrem user:ranking mike
    

    增加成员的分数

    zincrby key increment member
    //给tom增加了9分,分数变为了260分
    zincrby user:ranking 9 tom
    

    返回指定排名范围的成员

    //从低到高返回
    zrange key start end [withscores]
    //从高到低返回
    zrevrange key start end [withscores]
    //返回排名最低的是三个成员
    zrange user:ranking 0 2 withscores
    1) "kris"
    2) "1"
    3) "frank"
    4) "200"
    5) "tim"
    6) "220"
    

    返回指定分数范围的成员

    zrangebyscore key min max [withscores] [limit offset count]
    zrevrangebyscore key max min [withscores] [limit offset count]
    

    返回指定分数范围成员个数

    zcount key min max
    

    删除指定排名内的升序元素

    zremrangebyrank key start end
    

    删除指定分数范围的成员

    zremrangebyscore key min max
    

    求两个集合交集

    zinterstore destination numkeys key [key ...] [weights weight [weight ...]]
    [aggregate sum|min|max]
    //求交集,结果保存到user:ranking:1_inter_2
    zinterstore user:ranking:1_inter_2 2 user:ranking:1
    user:ranking:2
    

    求并集

    zunionstore destination numkeys key [key ...] [weights weight [weight ...]]
    [aggregate sum|min|max]
    //求并集
    zunionstore user:ranking:1_union_2 2 user:ranking:1
    user:ranking:2
    
    • 内部编码
      i. ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
      ii. skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。
    • 使用场景
      i. 用户点赞数排行
      ii. 排行榜
      iii. 展示用户信息及用户分数(例如学校中按学生分数排序)
    展开全文
  • 数据存储之用户输入内容长度限制

    千次阅读 2015-11-25 22:46:30
    数据库存储一个字符串我们一般会用char或varchar来定义字段的数据类型,不论选择哪种都会涉及到指定字段长度的问题,如果指定存储字段的字段长度是一个固定值,那显然在程序中就要限制用户输入内容的长度了,否则...

    数据库存储一个字符串我们一般会用char或varchar来定义字段的数据类型,不论选择哪种都会涉及到指定字段长度的问题,如果指定存储字段的字段长度是一个固定值,那显然在程序中就要限制用户输入内容的长度了,否则数据库存不了的情况下就会出错。

    先说说会出现的问题:

    1.数据库表中对应一列的数据类型

       列名       数据类型    允许NULL值 
    
    prize_name  varchar(20)  NOT NULL
    

    2.HTML页面FORM表单中限制奖励名称长度最大值为20

    <input type="text" name="prizeName" class="form-control" value="" maxlength="20" placeholder="奖励名称" />
    

    3.提交FORM表单进行数据库增加操作时报错(输入内容全为英文时正常,当输入汉字时抛下面的异常)

    这里写图片描述

    出现上述问题的是当在INPUT标签中加入maxlength属性,相当于对输入内容的字符串进行了.length()的判断,在忽略中文英文的情况下,它的确可以限制用户输入字符的长度,但是,进行数据存储时,数据库中存储内容的长度是根据字符串编码类型得到的字节长度进行限制的,我们可以通过下面的Demo测试一下不同编码类型的字节长度有什么区别。

    这里写图片描述

    得到的结果如下。

    这里写图片描述

    既然不同编码类型的字节长度有区别,数据库我使用的是SQLServer,那么,SQLServer的编码格式是什么呢?(默认的编码格式是GBK)执行下面的SQL可以查看SQLServer的编码格式。

    SELECT  COLLATIONPROPERTY('Chinese_PRC_Stroke_CI_AI_KS_WS', 'CodePage') 
    

    返回的结果为936(GBK),不同结果对应的编码格式如下。

    936 简体中文GBK 
    950 繁体中文BIG5 
    437 美国/加拿大英语 
    932 日文 
    949 韩文 
    866 俄文 
    65001 unicode UFT-8
    

    通过上面的Demo得到的结果,我们可以看到汉字在GBK、UTF-8和ISO8859-1编码下的字节长度分别为2、3、1,又因为SQLServer的编码格式为GBK,所以数据类型为varchar(20)的字段最多可以存储10个中文,当限制了最大输入maxlength为20个字符时,如果内容有中文数据库中就存不下了,也就会出现将截断字符串或二进制数据的异常,问题的原因根本上就在这里。

    第一种解决方案:

    在后台对Ajax请求过来的数据进行验证,和Demo中查看字节编码格式的方式相同。

    ResultBean<String> result = new ResultBean<String>(false, "", null);
    
    if(prizeBean.getPrizeName().getBytes("gbk").length > 20){
    
        result.setProperties(false, "奖励名称长度为10位以内的中文字符或长度为20位以内的字母,数字或半角字符!", null);
    
    }
    

    将接收到的文本内容转化为一个”GBK”编码格式的字节数组,限制字节长度即可,超出限制返回给用户错误提示。

    第二种解决方案:

    JavaScript有一个charCodeAt()方法,可返回指定位置的字符的 Unicode 编码。

    http://www.w3school.com.cn/jsref/jsref_charCodeAt.asp

    这里写图片描述

    通过练习w3school中charCodeAt()的例子,发现半角字符、数字、字母的Unicode码和ASCII码正好对应,查看ASCII码发现第32~126号(共95个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些半角标点符号、运算符号等。

    因为ASCII码32是空格,在提交FORM表单时,会对用户输入的内容过滤空格,所以判断长度时不需要判断空格,我们只要保证charCodeAt()返回的值在32和127之间(不包括32和127)时统计长度加1,输入其他内容时统计长度加2就可以了。

    下面是实现的JS代码:

    这里写图片描述

    HTML页面中增加onkeyup()事件:

    http://www.w3school.com.cn/jsref/event_onkeyup.asp

    <input type="text" name="prizeName" class="form-control" value="" placeholder="请输入奖励名称"  onkeyup="checkLength(this,20);"/> 
    

    当用户输入的内容超出长度限制后,会自动截断用户输入的内容。

    Tips:如果数据库中数据类型的长度存储中文完全够用并且需求也没有那么严格要限制中文个数和英文个数,那么我们直接使用maxlength就可以了,但是如果真的有这样的需求,那么我们完全可以按照上面的两种方式进行验证。

    展开全文
  • SQL中的五种数据类型

    千次阅读 2017-09-18 21:58:17
    SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型字符型VARCHAR 和 CHARVARCHAR型和CHAR型数据的这个差别是细微的,但是非常...

    SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型

    简要描述一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型

    字符型

    VARCHAR 和 CHAR

    VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。他们都是用来储存字符串长度小于255的字符。

    假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符——字符串Bill Gates的长度。 现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

    当你建立自己的站点时,你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时,你不需要为剪掉你数据中多余的空格而操心。

    VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要

    文本型

    TEXT

    使用文本型数据,你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时,应该使用文本型数据。

    注意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空,要么很大。

    当你从HTML form的多行文本编辑框(TEXTAREA)中收集数据时,你应该把收集的信息存储于文本型字段中。但是,无论何时,只要你能避免使用文本型字段,你就应该不适用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

    一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

    数值型

    SQL支持许多种不同的数值型数据。你可以存储整数 INT 、小数 NUMERIC、和钱数 MONEY。

    INT VS SMALLINT VS TINYINT
    他们的区别只是字符长度: INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数SMALLINT 型数据可以存储从-32768到32768的整数TINYINT 型的字段只能存储从0到255的整数,不能用来储存负数
    通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要修改它是很困难的。因此,为安全起见,你应该预测以下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。

    MUNERIC

    为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。

    当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。如:MUNERIC(23,0)

    一个 NUMERIC型数据的整数部分最大只能有28位,小数部分的位数必须小于或等于整数部分的位数,小数部分可以是零。

    MONEY VS SMALLMONEY

    你可以使用 INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型用于此目的。如果你希望你的网点能挣很多钱,你可以使用MONEY型数据。如果你的野心不大,你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC型数据。

    SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,如果可以的话,你应该用SMALLMONEY型来代替MONEY型数据,以节省空间。

    逻辑型

    BIT

    如果你使用复选框( CHECKBOX)从网页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。

    当心,在你创建好一个表之后,你不能向表中添加 BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。

    日期型

    DATETIME VS SMALLDATETIME

    一个 DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

    如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。

    DATETIME型字段在你输入日期和时间之前并不包含实际的数据

    原文转自:http://www.cnblogs.com/shenliang123/archive/2012/04/07/2435908.html

    展开全文
  • mysql数据类型长度

    万次阅读 2012-05-22 10:37:43
    MySQL数据库中常用字段类型: 整数型:TINYINT,SMALLINT,INT,BIGINT 小数型:FLOAT,DOUBLE,DECIMAL(M,D) 字符型:CHAR,VARCHAR ...有些整数类型以及他们最多所能拥有的数字位我们必须有所了解:
    MySQL数据库中常用字段类型:

    整数型:TINYINT,SMALLINT,INT,BIGINT
    小数型:FLOAT,DOUBLE,DECIMAL(M,D)
    字符型:CHAR,VARCHAR
    日期型:DATETIME ,DATE,TIMESTAMP

    备注型:TINYTEXT ,TEXT ,LONGTEXT 


    有些整数类型以及他们最多所能拥有的数字位我们必须有所了解:

    ·TINYINT——这个类型最多可容纳三位数。

    ·SMALLINT——最多可容纳五位数。

    ·MEDIUMINT——最多可容纳八位数。

    ·INT——可以容纳十位数。

    ·BIGINT——最多可容纳二十位数。

    TEXT可以接受文本输入,VARCHAR只能接受255个字符,但是TEXT可以用来存储超量的数据。

    当TIMESTAMP数据类型被选定,可以点击“CURRENT_TIMESTAMP”作为默认,MySQL会自动返回每个MySQL数据插入的确切时间。

    最近在使用mysql时才真正搞清楚int(11)中11的真正含义,以前只是简单的以为是用来表示存储最大为11位长的整数,其实没有那么简单,int类型规定只占用4个字节,最长也就是32位,当用有符号数表示时最大值为2147483647,无符号数表示时最大值位4294729693,由此可见,这个数字只是指定最大显示长度,所以int(10)、int(11)、int(12)应该没有什么区别,因为最大数值也就是10位。

    另外,如果用php中的intval转换mysql中的int(11)表示的数值时,最大也只能转换2147483647,再大的话就会溢出。看来php和mysql还是一致的。


    MySql支持3个浮点型:float,double,decimal。
    float:代表单精度浮点类型。
    double:代表双精度浮点数值。
    与整数类型一样,这些类型带有附加的参数。一个显示宽度指示器和一个小数点指示器。
    eg: float(5,2)则规定显示宽度为5的数字,小数点后面有2位数字。对于小数点后面的数字。
    超过了允许的数目时,系统会自动将它四舍五入插入。
    eg:

    1. mysql> create table t7 (abc float(5,2));
    2. Query OK, 0 rows affected (0.01 sec)

    3. mysql> insert into t7 values(123.456);
    4. Query OK, 1 row affected (0.02 sec)

    5. mysql> select * from t7;
    6. +--------+
    7. | abc |
    8. +--------+
    9. | 123.46 |
    10. +--------+
    11. 1 row in set (0.03 sec)
    float和double分别的存储:
    float类型的存储方式

    而双精度的存储方式为:

    double的存储是float精度的一倍。一般对精度要求高才用double。否则为了减少资源的浪费。我们都用float来代替小数。
    double:

    其中unsigned,zerofile 修饰符也能被float.decimal,double数据类型接受。结果和int整数的一样
    详情查看整数:
    写一个float类型的unsigned:

    对于decimal类型
    给定的DECIMAL 类型的取值范围取决于MySQL数据类型的版本。对于MySQL3.23 以前的版本,DECIMAL(M, D) 列的每个值占用M 字节,而符号(如果需要)和小数点包括在M 字节中。因此,类型为DECIMAL(5, 2) 的列,其取值范围为-9.99 到9 9 . 9 9,因为它们覆盖了所有可能的5 个字符的值。

    正如MySQL3.23 一样,DECIMAL 值是根据ANSI 规范进行处理的, ANSI 规范规定DECIMAL(M, D) 必须能够表示M 位数字及D 位小数的任何值。

    例如, DECIMAL(5, 2) 必须能够表示从-999.99 到999.99 的所有值。而且必须存储符号和小数点,因此自MySQL3.23以来DECIMAL 值占M + 2 个字节。对于DECIMAL(5, 2),“最长”的值(- 9 9 9 . 9 9)需要7个字节。

    在正取值范围的一端,不需要正号,因此MySQL数据类型利用它扩充了取值范围,使其超过了ANSI 所规范所要求的取值范围。如DECIMAL(5, 2) 的最大值为9 9 9 9 . 9 9,因为有7 个字节可用。


    一、VARCHAR与CHAR字符型数据的差异

    在MySQL数据库中,用的最多的字符型数据类型就是Varchar和Char.。这两种数据类型虽然都是用来存放字符型数据,但是无论从结构还是从数据的保存方式来看,两者相差很大。而且其具体的实现方式,还依赖与存储引擎。我这里就以大家最常用的MYISAM存储引擎为例,谈谈这两种数据类型的差异。在后续建议中,也是针对这种存储类型而言的。

    这里首先需要明白的一点是,这两种数据类型,无论采用哪一种存储引起,系统存储数据的方式都是不同的。正是因为如此,我们才有必要研究两者的不同。然后在合适的情况下,采用恰当的方式。了解这一点之后,我们再来看后续的内容。

    Varchar往往用来保存可变长度的字符串。简单的说,我们只是给其固定了一个最大值,然后系统会根据实际存储的数据量来分配合适的存储空间。为此相比CHAR字符数据而言,其能够比固定长度类型占用更少的存储空间。不过在实际工作中,由于某系特殊的原因,会在这里设置例外。如管理员可以根据需要指定ROW_FORMAT=FIXED选项。利用这个选项来创建MyISAM表的话,系统将会为每一行使用固定长度的空间。此时会造成存储空间的损耗。通常情况下,VARCHAR数据类型能够节约磁盘空间,为此往往认为其能够提升数据库的性能。不过这里需要注意的是,这往往是一把双刃剑。其在提升性能的同时,往往也会产生一些副作用。如因为其长度是可变的,为此在数据进行更新时可能会导致一些额外的工作。如在更改前,其字符长度是10位(Varchar规定的最长字符数假设是50位),此时系统就只给其分配10个存储的位置(假设不考虑系统自身的开销)。更改后,其数据量达到了20位。由于没有超过最大50位的限制,为此数据库还是允许其存储的。只是其原先的存储位置已经无法满足其存储的需求。此时系统就需要进行额外的操作。如根据存储引擎不同,有的会采用拆分机制,而有的则会采用分页机制。

    CHAR数据类型与VARCHAR数据类型不同,其采用的是固定长度的存储方式。简单的说,就是系统总为其分配最大的存储空间。当数据保存时,即使其没有达到最大的长度,系统也会为其分配这么多的存储空间。显然,这种存储方式会造成磁盘空间的浪费。这里笔者需要提醒的一点是,当字符位数不足时,系统并不会采用空格来填充。相反,如果在保存CHAR值的时候,如果其后面有空值,系统还会自动过滤其空格。而在进行数据比较时,系统又会将空格填充到字符串的末尾。

    显然,VARCHAR与CHAR两种字符型数据类型相比,最大的差异就是前者是可变长度,而后者则是固定长度。在存储时,前者会根据实际存储的数据来分配最终的存储空间。而后者则不管实际存储数据的长度,都是根据CHAR规定的长度来分配存储空间。这是否意味着CHAR的数据类型劣于VARCHAR呢?其实不然。否则的话,就没有必要存在CHAR字符类型了。虽然VARCHAR数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一些负面效应,有时候会抵消其带来的优势。为此在某些情况下,还是需要使用Char数据类型。

    二、项目建议

    根据上面的分析,我们知道VARCHAR数据类型是一把双刃剑,其在带来性能提升的同时,也可能会存在着一些额外的消耗。我们在评估到底是使用VARCHAR数据类型还是采用CHAR数据类型时,就需要进行均衡。在实际项目中,我们会考量如下情况。

    一是根据字符的长度来判断。如某个字段,像人的名字,其最长的长度也是有限的。如我们给其分配18个字符长度即可。此时虽然每个人的名字长度有可能不同,但是即使为其分配了固定长度的字符类型,即18个字符长度,最后浪费的空间也不是很大。而如果采用NVARCHAR数据类型时,万一以后需要改名,而原先的存储空间不足用来容纳新的值,反而会造成一些额外的工作。在这种情况下,进行均衡时,会认为采用CHAR固定长度的数据类型更好。在实际项目中,如果某个字段的字符长度比较短此时一般是采用固定字符长度。

    二是考虑其长度的是否相近。如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。

    另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销CHAR字符类型是没有的。

    三是从碎片角度进行考虑。使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。

    四是即使使用Varchar数据类型,也不能够太过于慷慨。这是什么意思呢?如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

    展开全文
  • Sql: MS SQL数据类型长度限制

    千次阅读 2009-04-09 22:47:00
    在 Microsoft SQL Server 中,每个列、局部变量、表达式和参数都有一个相关的数据类型,这是指定对象可持有的数据类型(整型、字符、money 等等)的特性。SQL Server 提供系统数据类型集,定义了可与 SQL ...
  • 【Qt】数据类型和有用的数据操作类

    千次阅读 2018-11-22 14:38:29
    除了C++提供的基本数据类型之外,Qt还提供了了对开发者而言非常有用的多种数据...为了能精确指定数据类型的大小,Qt提供了一下的基本数据类型: Qt基本数据类型 类型 大小 说明 bool 8位 true/fal...
  • 2.Redis五种数据类型及使用场景

    万次阅读 2021-08-07 09:52:49
    通过使用场景,带大家快速掌握Redis五种数据类型。string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。
  • MySQL数据库中的5种数据类型简介

    千次阅读 2014-01-13 13:47:05
    MySQL数据库中的5种数据类型是:字符型,文本型,数值型,逻辑型与日期型,以下就是文章的详细内容介绍,希望在你今后的学习中会有所帮助。 MySQL数据类型之一字符型 VARCHAR VS CHAR VARCHAR型和CHAR型数据...
  • redis的5种数据类型和数据结构

    千次阅读 2018-09-13 10:47:37
    Redis数据类型 String List Hash Set ZSet 底层数据结构 数组 双向链表 二维结构 ...
  • 相关文章:Redis简介以及和其他缓存数据库的区别前言Redis除了可以存储键还可以存储常见的5种数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令有一部分是可以公用的,但是还有一些其他的命令是...
  • Hive数据类型和使用注意事项详解

    万次阅读 多人点赞 2018-05-11 00:56:35
    其实Hive支持关系型数据库中的大多数基本数据类型,且同时支持关系型数据库中少见的3集合数类型(STRUCT,MAP,ARRAY)。然而学习技术最好的方式之一就是去查看官方文档。 Hive关于数据类型官网地址:Hive官网关于...
  • 【Redis】五种数据类型及其使用场景

    万次阅读 多人点赞 2020-05-25 22:58:57
    Redis 数据类型类型与类比java的模型 string --> String hash --> Hashmap list --> LinkList set --> HashSet sorted_set --> TreeSet String类型 redis 数据存储格式 redis自身是一个Map...
  • 数据结构基本概念研究,长度,精度,标度
  • MSSQLServer数据类型详解

    千次阅读 2014-02-27 10:21:38
    在计算机中数据有两特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。...中新增加的3 种数据类型。下面分类讲述各种数据类型。 4.3.1 整数数据类型,是最常用的数据类型之一
  • Pandas是基于NumPy构建的数据分析包,但它含有比ndarray更为高级的数据结构和操作工具,如Series类型、DataFrame类型等。 Pandas的便捷功能离不开高效的底层数据结构的支持。 Pandas主要有三种数据结构: Series...
  • 关于 Access 数据库数据类型

    千次阅读 2017-08-16 20:52:26
    关于 Access 数据库数据类型根据以下条件决定字段应使用哪种数据类型数据类型:决定字段可拥有的数据类型的字段特征。数据类型包括 Boolean、Integer、Long、Currency、Single、Double、Date、String 和 Variant...
  • 1. 标识符可以字母、数字、下划线(_)、美元符($)组成,但不能包含 @、%、空格等其它特殊字符 2. 不能以数字开头。如:123name 就是不合法 3. 标识符严格区分大小写。如: tmooc 和 tMooc 是两个不同的标识符 4....
  • Mysql数据类型

    千次阅读 2016-07-13 21:10:39
    所谓的数据类型:对数据进行统一的分类。从系统的角度出发,是为了使用统一的方式进行管理,更好的利用有限的空间。 SQL中将数据类型分了三大类:数值类型、字符串类型和时间日期类型 数值型 数值型数据:都是...
  • PostgreSQL 数据类型

    千次阅读 2017-11-06 20:13:06
    PostgreSQL 数据类型 ...PostgreSQL 的数据类型被分为四,分别是基本数据类型、复合数据类型、域和伪类型。    基本数据类型是数据库内置的数据类型,包括integer、char、varchar等数据类型。表6-1列出了Postg
  • Hive支持关系型数据库中的大多数基本数据类型,同时支持关系型数据库中很少出现的3集合数据类型,下面我们将简短地介绍一下这样做的原因。    其中一个需要考虑的因素就是这些数据类型是如何在文本文件中进行...
  • MySQL 中的数据类型介绍

    万次阅读 多人点赞 2016-04-29 20:24:03
    要了解一个数据库,我们也必须了解其支持的数据类型。 MySQL支持所有标准的SQL数据类型,主要分3类: ·数值类型 ·字符串类型 ·时间日期类型 另一类是几何数据类型,用的不多,也没多介绍。
  • PostpreSQL详细数据类型说明

    千次阅读 2013-09-23 09:34:05
    数据类型被分为四,分别是基本数据类型、复合数据类型、域和伪类型。     基本数据类型是数据库内置的数据类型,包括integer、char、varchar等数据类型。表6-1列出了PostgreSQL提供的所有基
  • Oracle建表常用数据类型详解

    千次阅读 2014-11-14 10:25:34
    创建表时,必须为表的各个列指定数据类型。如果实际的数据与该列的数据类型不相匹配,则数据库会拒绝保存。如为学生指定出生日期为“1980-13-31”。 在Oracle中,常见的数据类型有: 字符串:字符串分为定长类型...
  • Hive数据类型

    万次阅读 2017-01-22 11:22:42
    Hive数据类型 数值型 日期型 字符型 其他 复杂类型Hive数据类型本文参考Apache官网,更多内容请参考:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types1. 数值型 类型 支持范围 TINYINT 1...
  • Mysql的数据类型

    千次阅读 2016-07-24 14:46:45
    Mysql中光整型数据类型就有五:tinyint,smallint,mediumint,int,bigint Tinyint:迷你整型,占用一个字节保存数据,能够表示256个数值 Smallint:小整型,占用2个字节保存数据,能够表示65536个数值
  • C语言数据类型

    万次阅读 多人点赞 2018-09-12 15:10:25
    数据类型包括原始类型、多元组、记录单元、代数数据类型、抽象数据类型、参考类型以及函数类型。本文主要以51单片机中的数据类型为中心而展开的话题。  在keil C51或者iar for c8051编译器下:  int 占两个字节 ...
  • 标识符只能是英文字母、数字和下划线组成的字符串,并且第一个字符必须为字母或下划线; 标准C语言不限制标识符的长度,但是受到各个版本的C语言编译系统的限制。大多数情况下,标识符的前8位有效,也就是说,...
  • oracle数据类型

    千次阅读 2018-11-08 20:20:39
    oracle数据类型
  • 前面我们已经看到过一种用户(程序员)定义的数据类型:结构。除此之外,还有一些其它类型的用户自定义数据类型:   定义自己的数据类型 (typedef) C++ 允许我们在现有数据类型的基础上定义我们自己的数据类型。...
  • Hive支持关系型数据库中的大多数基本数据类型,同时也支持关系型数据库中很少出现的3集合数据类型, 其中一个需要考虑的因素就是这些数据类型是如何在文本文件中进行表示的,同时还要考虑文本存储中为了解决各种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 396,934
精华内容 158,773
关键字:

哪种数据类型必须由用户指定长度