Ⅰ sql镄勯氱敤鏁版嵁绫诲瀷
鏁版嵁绫诲瀷瀹氢箟浜嗘暟鎹搴撹〃镄勫垪涓瀛樻斁镄勫肩殑绉岖被銆
鏁版嵁搴撹〃涓镄勬疮涓鍒楅兘瑕佹眰链夊悕绉板拰鏁版嵁绫诲瀷銆係QL 寮鍙戜汉锻桦繀椤诲湪鍒涘缓 SQL 琛ㄦ椂鍐冲畾琛ㄤ腑镄勬疮涓鍒楀皢瑕佸瓨鍌ㄧ殑鏁版嵁镄勭被鍨嬨傛暟鎹绫诲瀷鏄涓涓镙囩撅纴鏄渚夸簬 SQL 浜呜В姣忎釜鍒楁湡链涘瓨鍌ㄤ粈涔堢被鍨嬬殑鏁版嵁镄勬寚鍗楋纴瀹冧篃镙囱瘑浜 SQL 濡备綍涓庡瓨鍌ㄧ殑鏁版嵁杩涜屼氦浜掋
涓嬮溃镄勮〃镙煎垪鍑轰简 SQL 涓阃氱敤镄勬暟鎹绫诲瀷锛
鏁版嵁绫诲瀷
鎻忚堪
CHARACTER(n)瀛楃/瀛楃︿覆銆傚浐瀹氶暱搴 n銆俈ARCHAR(n) 鎴
CHARACTER VARYING(n)瀛楃/瀛楃︿覆銆傚彲鍙橀暱搴︺傛渶澶ч暱搴 n銆侭INARY(n)浜岃繘鍒朵覆銆傚浐瀹氶暱搴 n銆侭OOLEAN瀛桦偍 TRUE 鎴 FALSE 鍊糣ARBINARY(n) 鎴
BINARY VARYING(n)浜岃繘鍒朵覆銆傚彲鍙橀暱搴︺傛渶澶ч暱搴 n銆侷NTEGER(p)鏁存暟鍊硷纸娌℃湁灏忔暟镣癸级銆傜簿搴 p銆係MALLINT鏁存暟鍊硷纸娌℃湁灏忔暟镣癸级銆傜簿搴 5銆侷NTEGER鏁存暟鍊硷纸娌℃湁灏忔暟镣癸级銆傜簿搴 10銆
BIGINT鏁存暟鍊硷纸娌℃湁灏忔暟镣癸级銆傜簿搴 19銆侱ECIMAL(p,s)绮剧‘鏁板硷纴绮惧害 p锛屽皬鏁扮偣钖庝綅鏁 s銆备緥濡傦细decimal(5,2) 鏄涓涓灏忔暟镣瑰墠链 3 浣嶆暟灏忔暟镣瑰悗链 2 浣嶆暟镄勬暟瀛椼侼UMERIC(p,s)绮剧‘鏁板硷纴绮惧害 p锛屽皬鏁扮偣钖庝綅鏁 s銆傦纸涓 DECIMAL 鐩稿悓锛塅LOAT(p)杩戜技鏁板硷纴灏炬暟绮惧害 p銆备竴涓閲囩敤浠 10 涓哄熀鏁扮殑鎸囨暟璁℃暟娉旷殑娴镣规暟銆傝ョ被鍨嬬殑 size 鍙傛暟鐢变竴涓鎸囧畾链灏忕簿搴︾殑鍗曚竴鏁板瓧缁勬垚銆俣EAL杩戜技鏁板硷纴灏炬暟绮惧害 7銆侳LOAT杩戜技鏁板硷纴灏炬暟绮惧害 16銆侱OUBLE PRECISION杩戜技鏁板硷纴灏炬暟绮惧害 16銆侱ATE瀛桦偍骞淬佹湀銆佹棩镄勫笺俆IME瀛桦偍灏忔椂銆佸垎銆佺掔殑鍊笺俆IMESTAMP瀛桦偍骞淬佹湀銆佹棩銆佸皬镞躲佸垎銆佺掔殑鍊笺侷NTERVAL鐢变竴浜涙暣鏁板瓧娈电粍鎴愶纴浠h〃涓娈垫椂闂达纴鍙栧喅浜庡尯闂寸殑绫诲瀷銆侫RRAY鍏幂礌镄勫浐瀹氶暱搴︾殑链夊簭闆嗗悎MULTISET鍏幂礌镄勫彲鍙橀暱搴︾殑镞犲簭闆嗗悎XML瀛桦偍 XML 鏁版嵁
Ⅱ SQL Server的常用数据类型(字符型)详解
对于程序中的string型字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,这里做一下对比。
定长或变长
所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。
Unicode或非Unicode
数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。
基于以上两点来看看字段容量
char,varchar 最多8000个英文,4000个汉字
nchar,nvarchar 可存储4000个字符,无论英文还是汉字
使用(个人偏好)
如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char
能确定长度又不一定是ansi字符或者,那么用nchar;
对于超大数据,如文章内容,使用nText
其他的通用nvarchar
char、varchar、nchar、nvarchar特点比较
CHAR
CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
VARCHAR
存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。
从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
TEXT
text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
NCHAR、NVARCHAR、NTEXT
这三种从名字上看比前面三种多了个"N"。和char、varchar比较起来,nchar、nvarchar最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
Ⅲ SQL的数据类型
【三】SQL的数据类型(表的字段类型)
3.1 四种基本的常用数据类型(表的字段类型)
1、字符型,2、数值型,3、日期型,4、大对象型
3.1.1 字符型:
字符类型char和varchar2的区别
SCOTT@ prod> create table t1(c1 char(10),c2 varchar2(10));
SCOTT@ prod> insert into t1 values('a','ab');
SCOTT@ prod> select length(c1),length(c2) from t1; char和varchar2默认以byte为计算单位
LENGTH(C1) LENGTH(C2)
---------- ----------
10 2
3.1.2 数值型:
3.1.3 日期型:
系统安装后,默认日期格式是DD-MON-RR, RR和YY都是表示两位年份,但RR是有世纪认知的,它将指定日期的年份和当前年份比较后确定年份是上个世纪还是本世纪(如表)。
当前年份 指定日期 RR格式 YY格式
------------------------------------------------------------------------------
1995 27-OCT-95 1995 1995
1995 27-OCT-17 2017 1917
2001 27-OCT-17 2017 2017
2013 27-OCT-95 1995 2095
3.1.4 LOB型:
大对象是10g 引入的,在11g中又重新定义,在一个表的字段里存储大容量数据,所有大对象最大都可能达到4G。CLOB,NCLOB,BLOB都是内部的LOB类型,没有LONG只能有一列的限制。
保存图片或电影使用BLOB最好、如果是小说则使用CLOB最好。虽然LONG、RAW也可以使用,但LONG是oracle将要废弃的类型,因此建议用LOB。
虽说将要废弃,但还没有完全废弃,比如oracle 11g里的一些视图如dba_views,对于text(视图定义)仍然沿用了LONG类型。
Oracle 11g重新设计了大对象,推出SecureFile Lobs的概念,相关的参数是db_securefile,采用SecureFile Lobs的前提条件是11g以上版本,ASSM管理等,符合这些条件的。BasicFile Lobs也可以转换成SecureFile Lobs。较之过去的BasicFile Lobs, SecureFile Lobs有几项改进:
1)压缩,2)去重,3)加密。
当create table定义LOB列时,也可以使用LOB_storage_clause指定SecureFile Lobs或BasicFile Lobs,而LOB的数据操作则使用Oracle提供的DBMS_LOB包,通过编写PL/SQL块完成LOB数据的管理。
3.2 数据类型的转换
3.2.1 转换的需求
什么情况下需要数据类型转换
1)如果表中的某字段是日期型的,而日期又是可以进行比较和运算的,这时通常要保证参与比较和运算的数据类型都是日期型。
2)当对函数的参数进行抽(截)取、拼接,或运算等操作时,需要转换为那个函数的参数要求的数据类型。
3)制表输出有格式需求的,可将date类型,或number类型转换为char类型
4)转换成功是有条件的,有隐性转换和显性转换两种方式
3.2.2隐性类型转换:
是指oracle自动完成的类型转换。在一些带有明显意图的字面值上,可以由Oracle自主判断进行数据类型的转换。
一般规律:
①比较、运算或连接时:
SQL> select empno,ename from emp where empno='7788'
empno本来是数值类型的,这里字符'7788'隐性转换成数值7788
SQL> SELECT '12.5'+11 FROM al;
将字符型‘12.5’运转成数字型再求和
SQL> SELECT 10+('12.5'||11) FROM al;
将数字型11隐转成字符与‘12.5’合并,其结果再隐转数字型与10求和
②调用函数时
SQL> select length(sysdate) from al;
将date型运转成字符型后计算长度
③向表中插入数据时
create table scott. t1 (id int,name char(10),birth date);
insert into scott.t1 values('123',456,'2017-07-15');
按照字段的类型进行隐式转换
3.2.3 显性类型转换
即强制完成类型转换(推荐),有三种形式的数据类型转换函数:
TO_CHAR
TO_DATE
TO_NUMBER
1)日期-->字符
SQL> select ename,hiredate, to_char(hiredate, 'DD-MON-YY') month_hired from emp
where ename='SCOTT';
ENAME HIREDATE MONTH_HIRED
---------- ------------------- --------------
SCOTT 1987-04-19 00:00:00 19-4月 -87
fm压缩空格或左边的'0'
SQL> select ename, hiredate, to_char(hiredate, 'fmyyyy-mm-dd') month_hired from emp
where ename='SCOTT';
ENAME HIREDATE MONTH_HIRED
---------- ------------------- ------------
SCOTT 1987-04-19 00:00:00 1987-4 19
其实DD-MM-YY是比较糟糕的一种格式,因为当日期中天数小于12时,DD-MM-YY和MM-DD-YY容易造成混乱。
以下用法也很常见:
SQL> select to_char(hiredate,'yyyy') FROM emp;
SQL> select to_char(hiredate,'mm') FROM emp;
SQL> select to_char(hiredate,'dd') FROM emp;
SQL> select to_char(hiredate,'DAY') FROM emp;
2)数字-->字符:9表示数字,L本地化货币字符
SQL> select ename, to_char(sal, 'L99,999.99') Salary from emp where ename='SCOTT';
ENAME SALARY
---------- --------------------
SCOTT 3,000.00
以下四个语句都是一个结果:
SQL> select to_char(1890.55,'$99,999.99') from al;
SQL> select to_char(1890.55,'$0G000D00') from al;
SQL> select to_char(1890.55,'$99G999D99') from al;
SQL> select to_char(1890.55,'$99G999D00') from al; 9和0可用,其他数字不行
3)字符-->日期
SQL> select to_date('1983-11-12', 'YYYY-MM-DD') tmp_DATE from al;
4)字符-->数字:
SQL> SELECT to_number('$123.45','$9999.99') result FROM al;
使用to_number时如果使用较短的格式掩码转换数字,就会返回错误。不要混淆to_number和to_char转换。
SQL> select to_number('123.56','999.9') from al;
报错:ORA-01722: 无效数字
练习:建立t1表,包括出生日期,以不同的日期描述方法插入数据,显示小于15岁的都是谁
SQL> create table t1 (id int,name char(10),birth date);
insert into t1 values(1,'tim',sysdate);
insert into t1 values(2,'brian',sysdate-365*20);
insert into t1 values(3,'mike',to_date('1998-05-11','yyyy-mm-dd'));
这一句也可以写成insert into t1 values(3,'mike',to_date('1998-05-11')),因为'1998-05-11'是和当前日期格式匹配的。
insert into t1 values(4,'nelson',to_date('15-2月-12','dd-mon-rr'));
SQL> select * from t1;
ID NAME BIRTH
---------- ---------- -------------------
1 tim 2016-02-25 17:34:00
2brian 1996-03-01 17:34:22
3 mike 1998-05-11 00:00:00
4 nelson 2012-02-15 00:00:00
SQL> select name||'的年龄是'||to_char(months_between(sysdate,birth)/12,99) age from t1
where months_between(sysdate,birth)/12<15;
AGE
-------------------------
tim 的年龄是 0
nelson 的年龄是 4
the end !!!
@jackman 共筑美好!
Ⅳ SQL 瀛楁电被鍨(瀛楃﹀瀷)
char,varchar,nvarchar.娌℃湁寰埚ぇ镄勫尯鍒銆俷varchar涓鐩樼敤𨱒ュ瓨鍌ㄦ眽瀛楋纴濡傛灉鐢ㄥ畠𨱒ュ瓨鍌ㄨ嫳鏂囦细娴璐逛竴涓瀛楄妭镄勭┖闂淬
char鍜寁archar镄勫尯鍒鍦ㄤ簬锛寁archar鍗犵敤镄勭┖闂翠细镊锷ㄨ皟鑺傦纴鐢ㄤ簬涓岖‘瀹氱殑瀛楃﹂暱搴︺傛瘆濡备綘瀹氢箟varchar(20),浣嗘槸鍦ㄦ彃鍏ユ暟鎹镄勬椂鍊椤彧鎻掑叆'aa',闾d箞瀹冨彧鍗犵敤2涓瀛楄妭镄勭┖闂达纴濡傛灉鏄痗ahr鍒欐槸20
Ⅳ SQL 数据库的类型有哪些
SQL 数据库分为:系统数据类型和用户自定义类型
系统数据类型:整形(int\smallint\tinyint)\浮点数据(real\decimal和numeric)\字符(char\varchar\nchar\nvarchar)\日期和时间数据类型(datetime\smalldatetime)\文本和图形数据类型(text\ntext\image)\货币数据类型(money\smallmoney)\位数据类型\二进制数据类型(binary\varbinary)\特殊(timestamp\uniqueidentifier)\新增数据(bigint\sql_varant\table)