精华内容
下载资源
问答
  • C++存储类型

    千次阅读 2010-06-30 13:43:00
    前段时间查到这方面的东西,看这里讲的不错,就翻译了,第一次尝试 :)原文...同样它也决定了一个对象的内存生存期(storage duration): 自动存储生存期(automatic storage duration),线程存储生存期(thread storage

    前段时间查到这方面的东西,看这里讲的不错,就翻译了,第一次尝试 :)

    原文地址:http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=28

     

     

    内存管理

             C++ 中,一种存储类别 (storage class) 定义了某个标志符的内存属性。同样它也决定了一个对象的内存生存期 (storage duration):  自动存储生存期 (automatic storage duration) 线程存储生存期 (thread storage duration) ,静态存储生存期 (static storage duration) 和空闲内存 (free store) 。每种存储类别规定了不同的内存使用限制,并表示不同的初始化,生命生存期,作用域和链接语义。决定一个标志符存储生存期的因素有:

     

    1>     出现在标志符声明前面的存储类型说明符 (e.g., static, thread_local, extern, register)

    2>     上下文 ( 比如说,定义在命名空间里的用户定义类型以及函数的参数 )

    3>     标识符类型 ( 一个函数,一个数据成员等等 )

     

    下面的章节将解释不同 C++ 存储生存期的区别,讨论他们的使用并列举他们在 C ,旧标准 C++ C++09 之间的区别。

     

    自动存储

             内存生存期是对象的一个属性,它定义了这个对象在内存中的最小生存时间。内存生存期由创建对象的构造函数决定,包括存储类型标志符。最常见的存储生存期是自动存储生存期。 因为在堆栈上分配的对象是自动分配和自动释放的,所以具有自动存储生存期。下面的对象具有自动存储属性:

     

    1>     没有被显式声明为 static, extern 或者 thread_local 的局部变量

    2>     声明带有 auto 存储说明符的局部变量 ( 适用 C 的所有版本和除了 C++09 之外的 C++ 版本 )

    3>     声明带有 register 存储说明符的对象

    4>     函数参数

    5>     临时对象

     

    存储类型标志符

             不要混淆了存储生存期与存储类型标志符。 C++09 存储类型标志符有:

    1>     register

    2>     static

    3>     thread_local

    4>     extern

    5>     mutable

     

    C++09 之前的存储类型说明符列表有点不同:

     

    1>     register

    2>     static

    3>     auto

    4>     extern

    5>     mutable

     

    C 语言中,存储类型说明符有:

     

    1>     register

    2>     static

    3>     auto

    4>     extern

     

    自动存储生存期

             下面的代码包括了自动存储生存期类型的不同声明,对象和变量。

       

     

     

             自动存储生存期类型的对象,简称自动对象,是在进入一个块或一个函数时自动创建的。当程序退出他们所声明的块或者函数时,他们就会被销毁,并且其内存会被自动回收。因此,在一个函数或者块的入口处会创建其自动对象。自动对象和非类对象的默认值都是不确定的。自动对象不可链接,不能从不同的 编译单元 (translation unit) 引用自动对象,并且他们只能在声明的作用域内可见。

             C++09 标准不再将 auto 视为一个内存类型标志符。因此,在 C++09 的代码里不能使用 auto 来指定自动内存生存期。因而 C++09 中自动存储生存期隐藏于上下文中。 auto 关键字在 C++09 中仍然存在,但是意义已经改变,所以程序员必须小心:使用了 auto 作为存储类型的旧版 C C++ 代码编译会出错。

     

    Register 存储类型标志符

             Register 存储类型标志符仅被用来修饰块中声明的对象或者函数参数。声明一个带有 register 标志符的对象暗示存取此对象会尽可能的快。例如,在一个双重循环里声明一个 register 类型的计数器可能会被存储在 CPU register 里而不是内存里。类似地,一个声明成 register 类型的类对象可能会被存储到 cache 里以便快速存取。这种 register 请求的有效性从某种程度上与实现相关。现在, C 或者 C++ 里已经几乎不使用 register 类型了。大部分编译器不会理会用户的 register 变量和对象的请求。相反,编译器会自动做出 register 类型的选择。 ISO C 规定用户不能获得 register 对象的地址。在 C++ 中可以这么做,但是这样会使 register 类型请求失效(对象将被存到内存中)。在其他所有方面(如初始化,生命生存期, 作用域)带有 register 存储类型的对象和自动对象具有同样的语义。


    Mutable 存储类型标志符

             Mutable 标志符修饰一个 const 类数据成员会使其 const 属性无效并且会允许更改 mutable 类型的类数据成员,尽管对象中其余的成员都是 const 类型的。换句话说,就算是 const 对象,其 mutable 成员通常是可以改变的。

     

     

             mutable 标志符只能被用在类数据成员的名字前,并且不能和 const 或者 static 同时使用,也不能用来修饰引用变量。

    例如

     

     

             成员 p 的声明中, mutable 标志符修饰指针,而 const 标志符修饰被指针指向的 int 数据。反之, q 的声明则是无效的,因为指针被同时声明为 const mutable 了。类似地,引用变量 r 的声明是无效的,因为引用变量不可变。

     

    静态存储生存期和线程存储生存期

             全局对象和在 namespace 作用域中的对象,类的静态数据成员,以及函数中驻留在静态存储区的局部静态对象。一个带有静态存储生存期属性的对象在程序的整个执行期间都会驻留在相同的内存中。每一个这种对象在程序的生命生存期内只创建一次。静态数据默认全部被初始化为 0 。带有一个自定义构造函数或者一个显式动态初始器的静态对象都将经历一个二次初始化阶段,我们称之为动态初始化。

     

             在一个函数中声明的对象,其作用域就被限制在那个函数中。下面的例子中有些静态存储的对象:

     

    extern 存储类型标志符

             extern 标志符只能用来修饰对象和函数。 extern 标志符不能被用在类成员或者函数参数的声明中。声明成 extern 的标识符具有外部链接性,意味着他们在同一个程序的所有 编译单元中都是可见的。

             namespace 作用域中声明的不带存储类型标志符的名称具有外部链接性,除非其由于被声明过而已经具有内部链接性,或者被声明为 const 类型。被声明为 const 类型的对象和未被显式声明为 extern 的对象具有内部链接性,意味着他们只在他们所声明的 编译单元内可见。

             注意 extern 关键字还可以用在别处,他也可以被用在模板的实现初始化和链接标识中,但是此时 extern 已经不再是一个存储类型标志符。

     

    thread_local 存储生存期

             thread_local 标志符表明其修饰的对象或者引用具有线程存储生存期。 thread_local 只能用来修饰命名空间中的对象或者引用的名字,以及块作用域中已经被指定为 static 存储类型的对象和引用。 thread_local 存储类型是 C++09 中的新特征。在此不详细讨论。

     

     

    展开全文
  • C变量和函数的存储类型

    千次阅读 2014-10-02 13:18:30
    C变量和函数的存储类型 在上一篇《C程序内存管理》的文章中,已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为。 C语言中变量的...

    C变量和函数的存储类型

    在上一篇《C程序内存管理》的文章中,已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为。

    C语言中变量的声明/定义格式如下:
    存储类型    类型修饰符    数据类型    变量名;
    存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto、extern、register、static,在一段执行程序中,可以为变量分配存储空间的有BSS、数据区、栈区、堆区。
    类型修饰符:用来修饰变量的存储和表现方式。包括long、short、signed、unsigned、void、const、volatile等。
    数据类型:用来指明该变量的存储大小,即一个该类型的变量要占用多少内存空间。基本数据类型有(char、int、float、指针类型)和由基本数据类型组成的用户自定义类型(struct、enum、typedef、union)

    C语言中函数的声明格式如下:
    存储类型    返回数据类型    函数名(参数列表)
    存储类型:用来标识该函数的作用域,而不是存储位置,主要有extern、static两个,auto和register不用来表示程序的存储类型。
    返回数据类型:函数退出时返回给调用者的数据类型。

    1、关于auto存储类型

    auto只能用来表示变量的存储类型,意味自动类型,表示该局部变量存储在运行时进程的栈区域,一般而言,对于局部变量、auto为默认的存储类型。所以可以省略不写。注意,局部变量如果没有初始化就直接拿来使用,那么系统会随机的分配一个值给它,这是不安全的。auto类型的变量每一次调用都会被初始化一次。


    2、关于全局变量和extern声明的数据

    extern既可以声明变量也可以标识函数。对于用来声明变量,extern声明在当前文件中引用的定义在其它文件中的全局变量。已经初始化的全局变量被存储在数据区中,所以声明其他文件中的全局变量将不会在为其分配内存空间。

    声明一个变量和定义一个变量的区别:

    定义一个变量:告诉编译器需要为该变量分配多少空间。

    声明一个变量:告诉编译器需要使用该变量,但该变量在其他位置被定义。

    对于一个函数,存储类型仅仅标识函数的作用域,默认的存储类型是extern。

    声明全局变量的两种方式:

    1、在头文件中定义,然后引用头文件

    2、在其他文件中定义,然后使用extern引用变量。


    3、register存储类型

    register关键字只能定义局部变量,只能修饰整形或者字符型,主要表示长期被使用的变量。被register定义的局部变量长期存在于寄存器中,寄存器变量被用于循环控制是比较理想的。和auto一样,如果未初始化就直接使用register变量,那么系统讲随机分配一个变量。


    4、static存储类型

    static既可以标识变量也可以标识函数。被定义为静态类型的变量(无论是全局的变量、还是局部变量)都存储在数据区域,其生命周期为整个程序。如果是静态的局部变量,其作用域为自身所处的{ }内,如果是静态全局变量,其作用域为整个当前文件。

    静态变量如果没有被初始化,系统讲自动初始化为0值,只会被初始化一次。

    static定义的函数的作用域只能是当前文件,因此不能在其他文件中被调用。对于不需要在其他文件中被调用的函数,声明为static是必要的,这样也在一定程度上避免函数名称的冲突。


    5、常量数据

    常量数据存储在代码段,其生存期为整个程序的运行时间,但是其作用域为当前文件。




    展开全文
  • 那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有的.....

    sqlite3是个很小的数据库,运行在手机,机顶盒上....那它就不可能像musql,sqlserver那么规范,有很多的数据类型,之前我也以为它定义了很多数据类型,其实不是他就5个存储类,那么多数据类型是根据一整套严谨的规则映射的!!还有什么char,varchar其实都是没有的..下面将结合文档详细讲解,相信看完你会了解更多,其实主要就是翻译文档....

    sqlite官网:http://www.sqlite.org/

    Sqlite3数据类型

    大多数的数据库引擎(到现在据我们所知的除了sqlite的每个sql数据库引擎)都使用静态的、刚性的类型,使用静态类型,数据的类型就由它的容器决定,这个容器是这个指被存放的特定列。 
    Sqlite使用一个更一般的动态类型系统,sqlite中,值的数据类型跟值本身相关,而不是与它的容器相关。Sqlite的动态类型系统和其他数据库的更为一般的静态类型系统相兼容,但同时,sqlite中的动态类型允许它能做到一些传统刚性类型数据库所不可能做到的事。 

    //这说的有点抽象,简单的意思就是存储的值和列的类型是分开的,列的类型可以有很多,而存储的类型就5个,这也是为什么sqlite这么小却能支持那么多数据类型的原因。就像映射一样,sqlite有一套自己的数据类型到存储类型的映射。

     

    1存储类型和数据类型

    1.0存储类型

    每一个值存储在一个SQLite数据库(或操作的 数据库引擎)都有以下的一个存储类(真正存在数据库中)

    ·       NULL值是null。

    ·       INTEEGER  值是有符号整形,根据值的大小以1,2,3,4,6或8字节存放 

    ·       REAL,值是浮点型值,以8字节IEEE浮点数存放。

    ·       TEXT,值是文本字符串,使用数据库编码(UTF-8,UTF-16BE或者       UTF-16LE)存放

    ·       BLOB,只是一个数据块,完全按照输入存放(即没有准换)

    从上可以看出存储类比数据类型更一般化。比如INTEGER存储类,包括6中不同长度的不同整形数据类型,这在磁盘上造成了差异。但是只要INTEGER值被从磁盘读出进入到内存进行处理,它们被转换成最一般的数据类型(8-字节有符号整形)。 

    Sqlite v3数据库中的任何列,除了整形主键列,可以用于存储任何一个存储类型的值。

    · sql语句中的中所有值,不管它们是嵌入在sql文本中或者是作为参数绑定到一个预编译的sql语句,它们的存储类型都是未定的。在下面描述的情况中,数据库引擎会在查询执行过程中在数值(numeric)存储类型(INTEGER和REAL)和TEXT之间转换值。

     

    1.1布尔类型 

     Sqlite没有单独的布尔存储类型,它使用INTEGER作为存储类型,0为false,1为true 


    1.2 Date和Time Datatype 

    Sqlite没有另外为存储日期和时间设定一个存储类集,内置的sqlite日期和时间函数能够将日期和时间以TEXT,REAL或INTEGER形式存放 
    l).  TEXT 作为IS08601字符串("YYYY-MM-DD HH:MM:SS.SSS") 
    2).  REAL 从格林威治时间11月24日,4174 B.C中午以来的天数 
    3).  INTEGER 从 1970-01-01 00:00:00 UTC以来的秒数 
    程序可以任意选择这几个存储类型去存储日期和时间,并且能够使用内置的日期和时间函数在这些格式间自由转换

    2.0 类型近似 (sqlite的数据集合)

    为了使sqlite和其他数据库间的兼容性最大化,sqlite支持列上“类型近似”的观点,列的类型近似指的是存储在列上数据的推荐类型。这里必须记住一点,这个类型是被推荐,而不是必须的。任何列仍然能存储任意类型的数据。只是一些列,给予选择的话,将会相比于其他的一些类型优选选择一些存储类型,这个列优先选择的存储类型被称为它的“近似”。 
    每个sqlite3数据库中的列都被赋予下面类型近似中的一种: 
    1).  TEXT 
    2).  NUMERIC 
    3).  INTEGER 
    4).  REAL 
    5).  BLOB   (BLOB过去叫做NONE,不过这个词更容易混淆“没有近似”)

    具有TEXT近似的列可以用NULL,TEXT或者BLOB类型存储数据。如果数值数据被插入到具有TEXT近似的列,在被存储前被转换为文本形式 
    一个有NUMERIC近似的列可以使用所有5中存储类来存储数据。当文本数据被存放到NUMERIC近似的列,这个文本的存储类被转换到INTEGERREAL(根据优先级顺序),如果这个转换是无损的话。对于TEXT和REAL存储类间的转换,如果数据的前15位的被保留的话sqlite就认为这个转换是无损的、可反转的。如果TEXT到INTEGER或REAL的转换不可避免的会造成损失,那么数据将使用TEXT存储类存储。不会企图去转换NULL或BLOB值。 

    一个字符串可能看起来像浮点数据,有小数点或指数符号,但是只要这个数据可以使用整形存放,NUMERIC近似就会将它转换到整形。比如,字符串 '3.0e+5'存放到一个具有NUMERIC近似的列中,被存为300000,而不是浮点型值300000.0。 
    具有INTEGER近似的列和具有NUMERIC近似的列表现相同。它们之间的差别仅处于转换描述上。 
    具有REAL近似的列和具有NUMERIC近似的列一样,除了它将整形数据转换成浮点型形式。 
    具有BLOB近似的列不会优先选择一个存储列,也不会强制将数据从一个存储类转换到另外一个类。 

     

    2.1列近似的决定因素 (映射关系)

    列的近似由这个列的声明类型所决定,根据下面的规则: 

    1) 如果声明类型包含”INT”字符串,那么这个列被赋予INTEGER近似 

     2)如果这个列的声明类型包含”CHAR”,”CLOB”,或者”TEXT”中的任意一个,那么这个列就有了TEXT近似。注意类型VARCHAR包含了”CHAR”字符串,那么也就被赋予了TEXT近似 

     3) 如果列的声明类型中包含了字符串”BLOB”或者没有为其声明类型,这个列被赋予BLOB近似 

     4)如果列的声明类型包含 “REAL”,”FLOA”,”DOUB”中任何一个,那么这个列就是REAL近似。

    5)其他的情况,列被赋予NUMERIC近似 
    **上面规则顺序对于决定列的近似很重要。一个列的声明类型为”CHARINT”的话同时会匹配规则1和2,但是第1个规则优先,所以这个列的近似将是INTEGER。

     

     

    2.2近似名称例子 (映射函数)

             (下面这个表显示了多少来自更传统的SQL操作的普通数据类型名称,使用上一节中的5个规则,被转换到近似类型。这个表只显示了sqlite能够接受的数据类名称的一个子集。注意到跟随类型名的圆括号内的数值参如:”VARCHAR(255)”)被sqlite忽略—sqlite不在字符串、BLOBS或者数值的长度上强加任何长度限制(除了一个全局的SQLITE_MAX_LENGTH限制)。//就是说加括号也没用,所以不用加 ,之前我还一直加

    Example Typenames From The
    CREATE TABLE Statement
    or CAST Expression(输入的类型)

    Resulting Affinity(近似的结果)

    Rule Used To Determine Affinity

    INT
    INTEGER
    TINYINT
    SMALLINT
    MEDIUMINT
    BIGINT
    UNSIGNED BIG INT
    INT2
    INT8

    INTEGER

    1

    CHARACTER(20)
    VARCHAR(255)
    VARYING CHARACTER(255)
    NCHAR(55)
    NATIVE CHARACTER(70)
    NVARCHAR(100)
    TEXT
    CLOB

    TEXT

    2

    BLOB
    no datatype specified

    BLOB

    3

    REAL
    DOUBLE
    DOUBLE PRECISION
    FLOAT

    REAL

    4

    NUMERIC
    DECIMAL(10,5)
    BOOLEAN
    DATE
    DATETIME

    NUMERIC

    5

     
    注意到声明类型为FLOATING POINT将被赋予INTEGER近似,而不是REAL近似,因为”INT””POINT”后边。

    声明类型为”STRING”的将被赋予NUMERIC,不是TEXT。(不动可以看2.1的规则,这是用了规则5)

    (从上面可以看出,sqlite3只是从声明类型字符串中去查找它知道的声明类型,比如”XINT”将被赋予INTEGER近似因为这个字符串里面有”INT”,所以这里并不需要一个单独的正确的声明类型,而是只要声明类型字符串里面包含了sqlite所知道的声明类型即可)

    2.3 列近似操作例子 

    CREATE TABLE t1(
        t  TEXT,     -- text affinity by rule 2
        nu NUMERIC,  -- numeric affinity by rule 5
        i  INTEGER,  -- integer affinity by rule 1
        r  REAL,     -- real affinity by rule 4
        no BLOB      -- no affinity by rule 3
    );
    
    -- Values stored as TEXT, INTEGER, INTEGER, REAL, TEXT.
    INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
    SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
    text|integer|integer|real|text
    
    -- Values stored as TEXT, INTEGER, INTEGER, REAL, REAL.
    DELETE FROM t1;
    INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
    SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
    text|integer|integer|real|real
    
    -- Values stored as TEXT, INTEGER, INTEGER, REAL, INTEGER.
    DELETE FROM t1;
    INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
    SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
    text|integer|integer|real|integer
    
    -- BLOBs are always stored as BLOBs regardless of column affinity.
    DELETE FROM t1;
    INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
    SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
    blob|blob|blob|blob|blob
    
    -- NULLs are also unaffected by affinity
    DELETE FROM t1;
    INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
    SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
    null|null|null|null|null
    这是文档中给的例子。。。

    3.0 比较表达式 

            Sqlite v3有一系列有用的比较操作符,包括 "=", "==", "<","<=", ">", ">=", "!=","<>", "IN", "NOT IN", "BETWEEN","IS", 和"IS NOT" 



    3.1 排序 

    比较操作的结果基于操作数的存储类型,根据下面的规则: 

    l  存储类型为NULL的值被认为小于其他任何的值(包括另一个存储类型为NULL的值) 

    l  一个INTEGER或REAL值小于任何TEXT或BLOB值。当一个INTEGER或REAL值与另外一个INTEGER或REAL值比较的话,就执行数值比较 

    l  TEXT值小于BLOB值。当两个TEXT值比较的时候,就根据序列的比较来决定结果 

    l  当两个BLOB值比较的时候,使用memcmp()来决定结果 

    简单的说:BLOB > TEXT > INTEGER/REAL > NULL

    3.2 比较操作数的近似(Affinity) 

            Sqlite可能在执行一个比较之前会在INTEGER,REAL或TEXT之间转换比较值。是否在比较操作之前发生转换基于操作数的近似(类型)。

    注意每一个表的列都有近似列,但表达式不一定有。
    操作数近似(类型)由以下的规则决定: 
    l  对一个列的简单引用的表达式与这个列有相同的affinity,注意如果X和Y.Z是列名,那么+X和+Y.Z均被认为是用于决定affinity的表达式 

    l  一个”CAST(expr as type)”形式的表达式与用声明类型为”type”的列有相同的affinity 

    l  其他的情况,一个表达式为NONE affinity 



    3.3 类型转换之前的比较 
             只有在转换是无损、可逆转的时候“应用近似”才意味着将操作数转换到一个特定的存储类。近似在比较之前被应用到比较的操作数,遵循下面的规则(根据先后顺序): 
    l  如果一个操作数有INTEGER,REAL或NUMERIC近似,另一个操作数有TEXT或BLOB近似或没有近似,那么NUMERIC近似被应用到另一个操作数 

    l  如果一个操作数有TEXT近似,另一个有没有近似,那么TEXT近似被应用到另一个操作数 

    l  其他的情况,不应用近似,两个操作数按本来的样子比较 

    表达式"aBETWEEN b AND c"表示两个单独的二值比较” a >= b AND a <= c”,即使在两个比较中不同的近似被应用到’a’。 

    3.4比较例子

    CREATE TABLE t1(
        a TEXT,      -- text affinity
        b NUMERIC,   -- numeric affinity
        c BLOB,      -- no affinity
        d            -- no affinity
    );
    
    -- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectively
    INSERT INTO t1 VALUES('500', '500', '500', 500);
    SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t1;
    text|integer|text|integer
    
    -- Because column "a" has text affinity, numeric values on the
    -- right-hand side of the comparisons are converted to text before
    -- the comparison occurs.
    SELECT a < 40,   a < 60,   a < 600 FROM t1;
    0|1|1
    
    -- Text affinity is applied to the right-hand operands but since
    -- they are already TEXT this is a no-op; no conversions occur.
    SELECT a < '40', a < '60', a < '600' FROM t1;
    0|1|1
    
    -- Column "b" has numeric affinity and so numeric affinity is applied
    -- to the operands on the right.  Since the operands are already numeric,
    -- the application of affinity is a no-op; no conversions occur.  All
    -- values are compared numerically.
    SELECT b < 40,   b < 60,   b < 600 FROM t1;
    0|0|1
    
    -- Numeric affinity is applied to operands on the right, converting them
    -- from text to integers.  Then a numeric comparison occurs.
    SELECT b < '40', b < '60', b < '600' FROM t1;
    0|0|1
    
    -- No affinity conversions occur.  Right-hand side values all have
    -- storage class INTEGER which are always less than the TEXT values
    -- on the left.
    SELECT c < 40,   c < 60,   c < 600 FROM t1;
    0|0|0
    
    -- No affinity conversions occur.  Values are compared as TEXT.
    SELECT c < '40', c < '60', c < '600' FROM t1;
    0|1|1
    
    -- No affinity conversions occur.  Right-hand side values all have
    -- storage class INTEGER which compare numerically with the INTEGER
    -- values on the left.
    SELECT d < 40,   d < 60,   d < 600 FROM t1;
    0|0|1
    
    -- No affinity conversions occur.  INTEGER values on the left are
    -- always less than TEXT values on the right.
    SELECT d < '40', d < '60', d < '600' FROM t1;
    1|1|1
    同样是文档给的源码。。。

    所有例子中的结果是相同的不变,如果把表达式替换--表达式的形式“a<40”被重写为”40>a”.

    4.0 操作符

    所有的数学操作符(+, -,*, /, %, <<, >>, &, |),在被执行前,都会将两个操作数都转换为数值存储类型(INTEGER和REAL)。即使这个转换是有损和不可逆的,转换仍然会执行。一个数学操作符上的NULL操作数将产生NULL结果。一个数学操作符上的操作数,如果以任何方式看都不像数字,并且又不为空的话,将被转换为0或0.0。 

    5排序,分组和复合选择

    当查询结果由ORDER BY子句排序,存储类NULL是第一位的,其次是INTEGER和REAL值穿插在数字顺序中,其次是TEXT值在整理 顺序,最后是BLOB在memcmp()中顺序。在分类之前没有存储类的转换发生。

    When groupingvalues with the GROUP BY clause values with different storage classes areconsidered distinct, except for INTEGER and REAL values which are consideredequal if they are numerically equal. No affinities are applied to any values asthe result of a GROUP by clause.

    The compoundSELECT operators UNION, INTERSECT and EXCEPT perform implicit comparisonsbetween values. No affinity is applied to comparison operands for the implicitcomparisons associated with UNION, INTERSECT, or EXCEPT - the values arecompared as is.

    6.0排序序列

    当SQLite比较两个String,它使用一个排序序列或排序函数(对同一事物的两种字)来确定哪一个String更好或者两个String一样。SQLite3内置的排序类型: BINARY,NOCASE, and RTRIM.。

    • BINARY -比较字符串数据使用memcmp(),忽视文本编码。
    • NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the comparison is performed. Note that only ASCII characters are case folded. SQLite does not attempt to do full UTF case folding due to the size of the tables required.
    • RTRIM -和BINARY一样,除了尾部的空格字符被忽略。

    应用程序可以注册其他功能的使用 整理sqlite3_create_collation()接口

    6.1 AssigningCollating Sequences from SQL

    Every column of every table has an associated collating function.If no collating function is explicitly defined, then the collating functiondefaults to BINARY. The COLLATE clause of the column definition is used to define alternativecollating functions for a column.

    The rules for determining which collating function to use for abinary comparison operator (=, <, >, <=, >=, !=, IS, and IS NOT)are as follows and in the order shown:

    1.  If either operand has an explicit collating function assignmentusing the postfix COLLATEoperator, then the explicit collating function is used forcomparison, with precedence to the collating function of the left operand.

    2.  If either operand is a column, then the collating function of thatcolumn is used with precedence to the left operand. For the purposes of theprevious sentence, a column name preceded by one or more unary "+"operators is still considered a column name.

    3.  Otherwise, the BINARY collating function is used for comparison.

    An operand of a comparison is considered to have an explicitcollating function assignment (rule 1 above) if any subexpression of theoperand uses the postfix COLLATEoperator. Thus, if a COLLATEoperator is usedanywhere in a comparision expression, the collating function defined by thatoperator is used for string comparison regardless of what table columns mightbe a part of that expression. If two or moreCOLLATEoperator subexpressionsappear anywhere in a comparison, the left most explicit collating function isused regardless of how deeply the COLLATE operators are nested in theexpression and regardless of how the expression is parenthesized.

    The expression "x BETWEEN y and z" is logicallyequivalent to two comparisons "x >= y AND x <= z" and workswith respect to collating functions as if it were two separate comparisons. Theexpression "x IN (SELECT y ...)" is handled in the same way as theexpression "x = y" for the purposes of determining the collatingsequence. The collating sequence used for expressions of the form "x IN(y, z, ...)" is the collating sequence of x.

    Terms of the ORDER BY clause that is part of a SELECT statement may be assigned a collatingsequence using the COLLATEoperator, in which case the specified collating function is used forsorting. Otherwise, if the expression sorted by an ORDER BY clause is a column,then the collating sequence of the column is used to determine sort order. Ifthe expression is not a column and has no COLLATE clause, then the BINARYcollating sequence is used.

    6.2排序序列的例子

    CREATE TABLE t1(
        x INTEGER PRIMARY KEY,
        a,                 /* collating sequence BINARY */
        b COLLATE BINARY,  /* collating sequence BINARY */
        c COLLATE RTRIM,   /* collating sequence RTRIM  */
        d COLLATE NOCASE   /* collating sequence NOCASE */
    );
                       /* x   a     b     c       d */
    INSERT INTO t1 VALUES(1,'abc','abc', 'abc  ','abc');
    INSERT INTO t1 VALUES(2,'abc','abc', 'abc',  'ABC');
    INSERT INTO t1 VALUES(3,'abc','abc', 'abc ', 'Abc');
    INSERT INTO t1 VALUES(4,'abc','abc ','ABC',  'abc');
     
    /* Text comparison a=b is performed using the BINARY collating sequence. */
    SELECT x FROM t1 WHERE a = b ORDER BY x;
    --result 1 2 3
    
    /* Text comparison a=b is performed using the RTRIM collating sequence. */
    SELECT x FROM t1 WHERE a = b COLLATE RTRIM ORDER BY x;
    --result 1 2 3 4
    
    /* Text comparison d=a is performed using the NOCASE collating sequence. */
    SELECT x FROM t1 WHERE d = a ORDER BY x;
    --result 1 2 3 4
    
    /* Text comparison a=d is performed using the BINARY collating sequence. */
    SELECT x FROM t1 WHERE a = d ORDER BY x;
    --result 1 4
    
    /* Text comparison 'abc'=c is performed using the RTRIM collating sequence. */
    SELECT x FROM t1 WHERE 'abc' = c ORDER BY x;
    --result 1 2 3
    
    /* Text comparison c='abc' is performed using the RTRIM collating sequence. */
    SELECT x FROM t1 WHERE c = 'abc' ORDER BY x;
    --result 1 2 3
    
    /* Grouping is performed using the NOCASE collating sequence (Values
    ** 'abc', 'ABC', and 'Abc' are placed in the same group). */
    SELECT count(*) FROM t1 GROUP BY d ORDER BY 1;
    --result 4
    
    /* Grouping is performed using the BINARY collating sequence.  'abc' and
    ** 'ABC' and 'Abc' form different groups */
    SELECT count(*) FROM t1 GROUP BY (d || '') ORDER BY 1;
    --result 1 1 2
    
    /* Sorting or column c is performed using the RTRIM collating sequence. */
    SELECT x FROM t1 ORDER BY c, x;
    --result 4 1 2 3
    
    /* Sorting of (c||'') is performed using the BINARY collating sequence. */
    SELECT x FROM t1 ORDER BY (c||''), x;
    --result 4 2 3 1
    
    /* Sorting of column c is performed using the NOCASE collating sequence. */
    SELECT x FROM t1 ORDER BY c COLLATE NOCASE, x;
    --result 2 4 3 1


    总算能完啦,虽然不完善,但是够我用啦,以后遇到再慢慢补充。。。
    转发请注明出处:http://blog.csdn.net/jycboy











    展开全文
  • redis5种存储类型及其存取指令

    万次阅读 2018-05-09 17:56:59
    Redis目前支持5种数据类型,分别是:String(字符串)List(列表)Hash(字典)Set(集合)Sorted Set(有序集合)下面就分别介绍这五种数据类型及其相应的操作命令。1. String(字符串)String是简单的 key-value ...

    Redis目前支持5种数据类型,分别是:

    1. String(字符串)
    2. List(列表)
    3. Hash(字典)
    4. Set(集合)
    5. Sorted Set(有序集合)

    下面就分别介绍这五种数据类型及其相应的操作命令。

    1. String(字符串)

    String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

    String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

    应用场景

    String是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

    相关命令

    SET key value                   设置key=value
    GET key                         或者键key对应的值
    GETRANGE key start end          得到字符串的子字符串存放在一个键
    GETSET key value                设置键的字符串值,并返回旧值
    GETBIT key offset               返回存储在键位值的字符串值的偏移
    MGET key1 [key2..]              得到所有的给定键的值
    SETBIT key offset value         设置或清除该位在存储在键的字符串值偏移
    SETEX key seconds value         键到期时设置值
    SETNX key value                 设置键的值,只有当该键不存在
    SETRANGE key offset value       覆盖字符串的一部分从指定键的偏移
    STRLEN key                      得到存储在键的值的长度
    MSET key value [key value...]   设置多个键和多个值
    MSETNX key value [key value...] 设置多个键多个值,只有在当没有按键的存在时
    PSETEX key milliseconds value   设置键的毫秒值和到期时间
    INCR key                        增加键的整数值一次
    INCRBY key increment            由给定的数量递增键的整数值
    INCRBYFLOAT key increment       由给定的数量递增键的浮点值
    DECR key                        递减键一次的整数值
    DECRBY key decrement            由给定数目递减键的整数值
    APPEND key value                追加值到一个键

    其中用于操作管理键的命令有:

    DEL key                         如果存在删除键
    DUMP key                        返回存储在指定键的值的序列化版本
    EXISTS key                      此命令检查该键是否存在
    EXPIRE key seconds              指定键的过期时间
    EXPIREAT key timestamp          指定的键过期时间。在这里,时间是在Unix时间戳格式
    PEXPIRE key milliseconds        设置键以毫秒为单位到期
    PEXPIREAT key milliseconds-timestamp        设置键在Unix时间戳指定为毫秒到期
    KEYS pattern                    查找与指定模式匹配的所有键
    MOVE key db                     移动键到另一个数据库
    PERSIST key                     移除过期的键
    PTTL key                        以毫秒为单位获取剩余时间的到期键。
    TTL key                         获取键到期的剩余时间。
    RANDOMKEY                       从Redis返回随机键
    RENAME key newkey               更改键的名称
    RENAMENX key newkey             重命名键,如果新的键不存在
    TYPE key                        返回存储在键的数据类型的值。

    使用示例

    redis 127.0.0.1:6379> set baidu http://www.baidu
    OK
    redis 127.0.0.1:6379> append baidu .com
    (integer) 20
    redis 127.0.0.1:6379> get baidu
    "http://www.baidu.com"
    redis 127.0.0.1:6379> set visitors 0
    OK
    redis 127.0.0.1:6379> incr visitors
    (integer) 1
    redis 127.0.0.1:6379> incr visitors
    (integer) 2
    redis 127.0.0.1:6379> get visitors
    "2"
    redis 127.0.0.1:6379> incrby visitors 100
    (integer) 102
    redis 127.0.0.1:6379> get visitors
    "102"
    redis 127.0.0.1:6379> type baidu
    string
    redis 127.0.0.1:6379> type visitors
    string
    redis 127.0.0.1:6379> ttl baidu
    (integer) -1
    redis 127.0.0.1:6379> rename baidu baidu-site
    OK
    redis 127.0.0.1:6379> get baidu
    (nil)
    redis 127.0.0.1:6379> get baidu-site
    "http://www.baidu.com"

    2. List(列表)

    Redis列表是简单的字符串列表,可以类比到C++中的std::list,简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40亿个元素。

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

    应用场景

    Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者push,消费者pop/bpop。

    相关命令

    • BLPOP
      BLPOP key1 [key2 ] timeout 取出并获取列表中的第一个元素,或阻塞,直到有可用
    • BRPOP
      BRPOP key1 [key2 ] timeout 取出并获取列表中的最后一个元素,或阻塞,直到有可用
    • BRPOPLPUSH
      BRPOPLPUSH source destination timeout 从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用
    • LINDEX
      LINDEX key index 从一个列表其索引获取对应的元素
    • LINSERT
      LINSERT key BEFORE|AFTER pivot value 在列表中的其他元素之后或之前插入一个元素
    • LLEN
      LLEN key 获取列表的长度
    • LPOP
      LPOP key 获取并取出列表中的第一个元素
    • LPUSH
      LPUSH key value1 [value2] 在前面加上一个或多个值的列表
    • LPUSHX
      LPUSHX key value 在前面加上一个值列表,仅当列表中存在
    • LRANGE
      LRANGE key start stop 从一个列表获取各种元素
    • LREM
      LREM key count value 从列表中删除元素
    • LSET
      LSET key index value 在列表中的索引设置一个元素的值
    • LTRIM
      LTRIM key start stop 修剪列表到指定的范围内
    • RPOP
      RPOP key 取出并获取列表中的最后一个元素
    • RPOPLPUSH
      RPOPLPUSH source destination 删除最后一个元素的列表,将其附加到另一个列表并返回它
    • RPUSH
      RPUSH key value1 [value2] 添加一个或多个值到列表
    • RPUSHX
      RPUSHX key value 添加一个值列表,仅当列表中存在

    使用示例

    redis 127.0.0.1:6379> lpush list1 redis
    (integer) 1
    redis 127.0.0.1:6379> lpush list1 hello
    (integer) 2
    redis 127.0.0.1:6379> rpush list1 world
    (integer) 3
    redis 127.0.0.1:6379> llen list1
    (integer) 3
    redis 127.0.0.1:6379> lrange list1 0 3
    1) "hello"
    2) "redis"
    3) "world"
    redis 127.0.0.1:6379> lpop list1
    "hello"
    redis 127.0.0.1:6379> rpop list1
    "world"
    redis 127.0.0.1:6379> lrange list1 0 3
    1) "redis"

    3. Hash(字典,哈希表)

    类似C#中的dict类型或者C++中的hash_map类型。

    Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

    应用场景

    假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。

    相关命令

    • HDEL
      HDEL key field[field...] 删除对象的一个或几个属性域,不存在的属性将被忽略
    • HEXISTS
      HEXISTS key field 查看对象是否存在该属性域
    • HGET
      HGET key field 获取对象中该field属性域的值
    • HGETALL
      HGETALL key 获取对象的所有属性域和值
    • HINCRBY
      HINCRBY key field value 将该对象中指定域的值增加给定的value,原子自增操作,只能是integer的属性值可以使用
    • HINCRBYFLOAT
      HINCRBYFLOAT key field increment 将该对象中指定域的值增加给定的浮点数
    • HKEYS
      HKEYS key 获取对象的所有属性字段
    • HVALS
      HVALS key 获取对象的所有属性值
    • HLEN
      HLEN key 获取对象的所有属性字段的总数
    • HMGET
      HMGET key field[field...] 获取对象的一个或多个指定字段的值
    • HSET
      HSET key field value 设置对象指定字段的值
    • HMSET
      HMSET key field value [field value ...] 同时设置对象中一个或多个字段的值
    • HSETNX
      HSETNX key field value 只在对象不存在指定的字段时才设置字段的值
    • HSTRLEN
      HSTRLEN key field 返回对象指定field的value的字符串长度,如果该对象或者field不存在,返回0.
    • HSCAN
      HSCAN key cursor [MATCH pattern] [COUNT count] 类似SCAN命令

    使用示例

    127.0.0.1:6379> hset person name jack
    (integer) 1
    127.0.0.1:6379> hset person age 20
    (integer) 1
    127.0.0.1:6379> hset person sex famale
    (integer) 1
    127.0.0.1:6379> hgetall person
    1) "name"
    2) "jack"
    3) "age"
    4) "20"
    5) "sex"
    6) "famale"
    127.0.0.1:6379> hkeys person
    1) "name"
    2) "age"
    3) "sex"
    127.0.0.1:6379> hvals person
    1) "jack"
    2) "20"
    3) "famale"

    4. Set(集合)

    可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。

    set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

    应用场景

    Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

    又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。

    相关命令

    • SADD
      SADD key member [member ...] 添加一个或者多个元素到集合(set)里
    • SACRD
      SCARD key 获取集合里面的元素数量
    • SDIFF
      SDIFF key [key ...] 获得队列不存在的元素
    • SDIFFSTORE
      SDIFFSTORE destination key [key ...] 获得队列不存在的元素,并存储在一个关键的结果集
    • SINTER
      SINTER key [key ...] 获得两个集合的交集
    • SINTERSTORE
      SINTERSTORE destination key [key ...] 获得两个集合的交集,并存储在一个集合中
    • SISMEMBER
      SISMEMBER key member 确定一个给定的值是一个集合的成员
    • SMEMBERS
      SMEMBERS key 获取集合里面的所有key
    • SMOVE
      SMOVE source destination member 移动集合里面的一个key到另一个集合
    • SPOP
      SPOP key [count] 获取并删除一个集合里面的元素
    • SRANDMEMBER
      SRANDMEMBER key [count] 从集合里面随机获取一个元素
    • SREM
      SREM key member [member ...] 从集合里删除一个或多个元素,不存在的元素会被忽略
    • SUNION
      SUNION key [key ...] 添加多个set元素
    • SUNIONSTORE
      SUNIONSTORE destination key [key ...] 合并set元素,并将结果存入新的set里面
    • SSCAN
      SSCAN key cursor [MATCH pattern] [COUNT count] 迭代set里面的元素

    使用示例

    redis> SADD myset "Hello"
    (integer) 1
    redis> SADD myset "World"
    (integer) 1
    redis> SMEMBERS myset
    1) "World"
    2) "Hello"
    redis> SADD myset "one"
    (integer) 1
    redis> SISMEMBER myset "one"
    (integer) 1
    redis> SISMEMBER myset "two"
    (integer) 0

    使用集合数据结构的典型用例是朋友名单的实现:

    redis 127.0.0.1:6379> sadd friends:leto ghanima paul chani jessica
    (integer) 4
    redis 127.0.0.1:6379> sadd friends:duncan paul jessica alia
    (integer) 3
    redis 127.0.0.1:6379> sismember friends:leto jessica
    (integer) 1   #不管一个用户有多少个朋友,我们都能高效地(O(1)时间复杂度)识别出用户X是不是用户Y的朋友
    redis 127.0.0.1:6379> sismember friends:leto vladimir
    (integer) 0
    redis 127.0.0.1:6379> sinter friends:leto friends:duncan    #我们可以查看两个或更多的人是不是有共同的朋友
    1) "paul"
    2) "jessica"
    redis 127.0.0.1:6379> sinterstore friends:leto_duncan friends:leto friends:duncan # 可以在一个新的关键字里存储结果
    (integer) 2

    5. Sorted Set(有序集合)

    Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。

    Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每个元素的集合)。

    Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

    使用场景

    Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

    又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。

    相关命令

    • ZADD
      ZADD key score1 member1 [score2 member2] 添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
    • ZCARD
      ZCARD key 得到的有序集合成员的数量
    • ZCOUNT
      ZCOUNT key min max 计算一个有序集合成员与给定值范围内的分数
    • ZINCRBY
      ZINCRBY key increment member 在有序集合增加成员的分数
    • ZINTERSTORE
      ZINTERSTORE destination numkeys key [key ...] 多重交叉排序集合,并存储生成一个新的键有序集合。
    • ZLEXCOUNT
      ZLEXCOUNT key min max 计算一个给定的字典范围之间的有序集合成员的数量
    • ZRANGE
      ZRANGE key start stop [WITHSCORES] 由索引返回一个成员范围的有序集合(从低到高)
    • ZRANGEBYLEX
      ZRANGEBYLEX key min max [LIMIT offset count]返回一个成员范围的有序集合(由字典范围)
    • ZRANGEBYSCORE
      ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 返回有序集key中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员,有序集成员按 score 值递增(从小到大)次序排列
    • ZRANK
      ZRANK key member 确定成员的索引中有序集合
    • ZREM
      ZREM key member [member ...] 从有序集合中删除一个或多个成员,不存在的成员将被忽略
    • ZREMRANGEBYLEX
      ZREMRANGEBYLEX key min max 删除所有成员在给定的字典范围之间的有序集合
    • ZREMRANGEBYRANK
      ZREMRANGEBYRANK key start stop 在给定的索引之内删除所有成员的有序集合
    • ZREMRANGEBYSCORE
      ZREMRANGEBYSCORE key min max 在给定的分数之内删除所有成员的有序集合
    • ZREVRANGE
      ZREVRANGE key start stop [WITHSCORES] 返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分
    • ZREVRANGEBYSCORE
      ZREVRANGEBYSCORE key max min [WITHSCORES] 返回一个成员范围的有序集合,以socre排序从高到低
    • ZREVRANK
      ZREVRANK key member 确定一个有序集合成员的索引,以分数排序,从高分到低分
    • ZSCORE
      ZSCORE key member 获取给定成员相关联的分数在一个有序集合
    • ZUNIONSTORE
      ZUNIONSTORE destination numkeys key [key ...] 添加多个集排序,所得排序集合存储在一个新的键
    • ZSCAN
      ZSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代排序元素集和相关的分数

    使用示例

    redis 127.0.0.1:6379> zadd dbs 100 redis
    (integer) 1
    redis 127.0.0.1:6379> zadd dbs 98 memcached
    (integer) 1
    redis 127.0.0.1:6379> zadd dbs 99 mongodb
    (integer) 1
    redis 127.0.0.1:6379> zadd dbs 99 leveldb
    (integer) 1
    redis 127.0.0.1:6379> zcard dbs
    (integer) 4
    redis 127.0.0.1:6379> zcount dbs 10 99
    (integer) 3
    redis 127.0.0.1:6379> zrank dbs leveldb
    (integer) 1
    redis 127.0.0.1:6379> zrank dbs other
    (nil)
    redis 127.0.0.1:6379> zrangebyscore dbs 98 100
    1) "memcached"
    2) "leveldb"
    3) "mongodb"
    4) "redis"

    Reference

    展开全文
  • mysql中时间存储类型的选择

    千次阅读 2016-03-22 16:40:57
    一般应用中,我们用timestamp,datetime,int类型存储时间格式: int(对应javaBean中的Integer或int) 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能...
  • Oracle存储过程表名称名称做参数,动态SQL背景 当前的系统中有几种日志信息做了分表处理,每个月插入到一个表中,一个表的分表有12个。这样的这种表有四个左右。 有个定时器,每天晚上的时候去执行满足条件的表去...
  • 在SQL Server中修改字段类型和字段名称  --以下是完整的SQL执行语句  if exists(select * from syscolumns where id=object_id('数据表名称') and name='字段名') --判断该字段是否存在  begin  ...
  • SharedPreferences存储多种类型

    千次阅读 2016-07-22 11:06:14
    SharedPreferences轻量级存储 public class SharedManager { String SHARE_NAME = "CUNCU";//文件名称 public static void saveUid(String uid) {  SharedPreferences sharedPreferences = AppApplication.get
  • Redis的五种存储类型和其应用场景

    万次阅读 2016-01-11 11:30:28
    常用数据类型简介:redis常用五种数据类型:string,hash,list,set,zset(sorted set).1.String类型String是最简单的类型,一个key对应一个valueString类型的数据最大1G。 String类型的值可以被视作integer,从而可以...
  • mysql存储引擎

    万次阅读 多人点赞 2019-07-31 19:28:44
    数据库存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行...因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(Table Type,即存储和操作此表...
  • Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 3. 标识符的链接属性 主要用于处理多次声明相同的标识符名称后,如何判断这些标识符...
  • Technorati 标签: C,标识符,作用域,命名空间,链接属性,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题。而且这些问题,深究起来有时也让我们很迷惑。 ...
  • 1、查询的语句: select a.id,b.name,a.*,b.* from syscomments a join sysobjects b on a.id=b.id where b.xtype='P' and a.text like '%usp_cm...‘%usp_cm%’就是你能记得的存储过程中的内容。 2、查找类型: s
  • 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据类型
  • int类型在内存中的存储方式

    万次阅读 多人点赞 2015-12-08 01:57:00
    此文为个人作为初学者的学习记录 Q1:int类型在内存中是以何种方式存储的? 要解决这个问题,我们需要首先比较深入地理解下int类型。 { 本文中的int类型的相关数据,如无特别说明都以32位操作...类型名称 占字节数
  • Mysql常用数据类型存储大小及范围

    千次阅读 2019-08-27 17:24:37
    类型名称 说明 存储大小 取值范围 TINYINT 很小的正数(一般用于boolean存储) 1个字节 -128~127 unsigned:0~255 SMALLINT 小正数 2个字节 -32768~32767 unsigned:0~65535...
  • SQL Server 存储过程及类型

    千次阅读 2011-02-18 11:32:00
    为了易于修改和扩充,经常会将负责不同功能的语句集中起来而且按照用途分别独立放置,以便能够反复调用,而这些独立放置且拥有不同功能的语句,既是“过程” 存储过程的类型 1. 系统存储过程 系统...
  • Redis五种类型存储

    千次阅读 2017-04-26 14:42:43
    set(key, value):给数据库中名称为key的string赋予值value get(key):返回数据库中名称为key的string的value getset(key, value):给名称为key的string赋予上一次的value mget(key1, key2,…, key N):返回库...
  • ArrayList集合存储基本数据类型

    千次阅读 2019-06-10 16:51:52
    *如果希望向集合ArrayList当中存储基本类型数据,必须使用基本类型对应的“包装类” * 基本类型 包装类 (引用类型,包装类都位于java.Lang包下) * byte Byte * short Short * long Long * int Integer 【特殊...
  • 存储过程 Sp_rename 修改表名称列名

    千次阅读 2011-03-18 02:06:00
    存储过程 Sp_rename 修改表名称列名 sql server2009-02-25 10:39:28阅读80评论0 字号:大中小 订阅 Sp_rename 存储过程可以修改当前数据库中用户对象的名称,如表、列、索引、存储过程等待。...
  • 数组可以存储引用类型数据吗 基础 (The basics) 只是为了使我们都在同一页面上,我们假设您要执行上述情况,但是您没有可用于将数据保存在表中的Access权限,或者您不想处理开销,或者您不能在Excel中使用工作表,...
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...
  • 寄存器名称与数据类型

    千次阅读 2018-04-15 22:06:22
    x86-64结构的CPU包含一组16个存储64位值的通用目的寄存器;历史上最开始的寄存器只有8个8位的寄存器,后来经历了16位, 32位直至现在的64位,寄存器也由8个扩展到16个。 程序可以依据每个寄存器的名称使用其中的8位...
  • redis各种类型存储情况分析

    万次阅读 2015-01-22 22:19:58
    使用REDIS_ENCODING_ZIPLIST编码存储散列类型时元素的排列方式是:元素1存储字 段1,元素2存储字段值1,依次类推, 例如,当执行命令HSET hkey foo bar命令后,hkey键值的内存结构如下图所示, ...
  • MySQL-存储过程(数据类型、函数)

    千次阅读 2019-05-25 03:33:45
    主要介绍存储过程的创建,注意事项,数据类型,常用函数。
  • 假如需要在pg上面写存储过程,那么返回类型必定是一个疑问点。 一般而言,对于一个查询语句,为了可以统一动态返回各种数据,我们是不会蠢到每一个存储过程都额外编写一个返回类型 譬如: (id,name,password) 之类的...
  • 开发中,我们经常用Create Procedure命令创建存储过程,而在创建过程时实际发生的是,Query Analyzer检查其语法,检查完毕并正确后将其插入系统表syscomments中,而在过程中引用的对象名称在该过程被执行之前不被...
  • Oracle没有数组类型,如果要传递
  • mysql存储过程

    千次阅读 2012-10-08 19:59:52
    存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin .........
  • 阅读这篇文章来帮助决定何时选择索引或类型存储数据。 没有人知道新的数据是应该放进已经存在索引的新的类型中还是一个新的索引中。 对于新用户来说,这是一个反复出现的问题,如果不了解这两者是如何实现的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 790,607
精华内容 316,242
关键字:

存储类型名称