mysql数据库 JDBC 对照
类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述
VARCHARL+NVARCHARjava.lang.String12
CHARNCHARjava.lang.String1
BLOBL+NBLOB-4
TEXT65535VARCHARjava.lang.String-1
INTEGER4INTEGER UNSIGNEDjava.lang.Long4
TINYINT3TINYINT UNSIGNEDjava.lang.Integer-6
SMALLINT5SMALLINT UNSIGNEDjava.lang.Integer5
MEDIUMINT8MEDIUMINT UNSIGNEDjava.lang.Integer4
BIT1BITjava.lang.Boolean-7
BIGINT20BIGINT UNSIGNEDjava.math.BigInteger-5
FLOAT4+8FLOATjava.lang.Float7
DOUBLE22DOUBLEjava.lang.Double8
DECIMAL11DECIMALjava.math.BigDecimal3
BOOLEAN1同TINYINT
ID11PK (INTEGER UNSIGNED)java.lang.Long4
DATE10DATEjava.sql.Date91
TIME8TIMEjava.sql.Time92
DATETIME19DATETIMEjava.sql.Timestamp93
TIMESTAMP19TIMESTAMPjava.sql.Timestamp93
YEAR4YEARjava.sql.Date91
要获取更多信息,参看11.2节“Numeric Types”。存储需求见11.5节“Data Type StorageRequirements”。
M表示最大显示宽度(maximum display width),最大显示宽度的合法值不超过255。显示宽度与存储尺寸、取值范围无关,这在第11.2节"Numeric Types"中有说明。
如果您在数值型属性列中指定了ZEROFILL属性,MySQL自动为此列添加UNSIGNED属性。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENTUNIQUE的别名。
整数属性列定义中的SERIAL DEFAULT VALUE是NOTNULL AUTO_INCREMENT UNIQUE的别名。
警告:如果您在做减法运算时其中一个操作数是UNSIGNED类型,那么结算结果也是无符号的,参看12.8节"Cast Functions and Operators"。
·BIT[(M)]
位域类型。M表示每个值的比特数,从1到64,缺省为1。
这个数据类型是为MyISAM加入到MySQL5.0.3的,并在5.0.5扩展到了MEMORY、InnoDB和BDB。在5.0.3之前,BIT只是TINYINT(1)的同义词。
·TINYINT[(M)] [UNSIGNED] [ZEROFILL]
非常小的整数。有符号型的范围从-128到127,无符号型的范围从0到255。
·BOOL,BOOLEAN
这些类型是TINYINT(1)的同义词,值为0就认为是false,非0值认为是true。
将来会引入完全的布尔类型处理和标准SQL保持一致。
·SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小整数。有符号型的范围是-32768到32767,无符号型的范围是0到65535。
·MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
中型大小的整数。有符号型的范围是-8388608到8388607,无符号型的范围是0到16777215。
·INT[(M)] [UNSIGNED] [ZEROFILL]
正常大小的整数,有符号型的范围是-2147483648到2147483647,无符号型的范围是0到4294967295。
·INTEGER[(M)] [UNSIGNED] [ZEROFILL]
这个类型是INT的同义词。
·BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整数,有符号型的范围是-9223372036854775808到9223372036854775807,无符号型的范围是0到18446744073709551615。
关于BIGINT属性列,以下事情你必须清楚:
o所有算术都是用有符号的BIGINT或DOUBLE值做计算的,所以不要使用大于9223372036854775807(63位)的大整数,除非用在位运算函数中。否则,计算结果的最后几位数可能错误,因为从 BIGINT 向 DOUBLE 转化时会产生舍入误差。
MySQL在以下情形中使用BIGINT:
§在BIGINT属性列中使用整数(而不是浮点数)来存储大的无符号值时。
§在MIN(col_name)或MAX(col_name)函数中,col_name引用了BIGINT属性列。
§当使用运算符(+ - *等等)时两个操作数都是整数。
o通过存入一个字符串,总能够在BIGINT属性列中存入一个精确的整数值。这种情况下,MySQL进行字符串向数字的转化,转化过程不会引入双精度中间表示。
o- + *运算符在两个操作数都是整数值时使用BIGINT做运算。这意味着当两个大整数相乘(或者从返回整型值的函数取得结果)时,如果结果大于9223372036854775807就可能会得到意想不到的后果。
·FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
小型(单精度)浮点数。允许值包括-3.402823466E+38到-1.175494351E-38,0,以及1.175494351E-38到3.402823466E+38。这些都是理论极限,基于IEEE标准。真实范围可能要小一些,取决于硬件和操作系统。
M是总的小数位数,D是小数点之后的位数。如果省略了M和D,值将会按照硬件的允许的范围存储。单精度浮点数具有大约7位有效数字。
如果指定了 UNSIGNED,负数值将不被接受。
使用FLOAT可能会造成意想不到的问题,因为在MySQL中所有的计算都是用双精度数完成。参看A.5.7节"Solving Problems with No Matching Rows"。
·DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
正常大小(双精度)浮点数。允许值包括-1.7976931348623157E+308到-2.2250738585072014E-308,0,和2.2250738585072014E-308到1.7976931348623157E+308。这些都是理论极限,基于IEEE标准。真实范围可能要小一些,取决于硬件和操作系统。
M是总的小数位数,D是小数点之后的位数。如果省略了M和D,值将会按照硬件的允许的范围存储。双精度浮点数具有大约15位有效数字。
如果指定了 UNSIGNED,负数值将不被接受。
·DOUBLEPRECISION[(M,D)] [UNSIGNED] [ZEROFILL],REAL[(M,D)] [UNSIGNED] [ZEROFILL]
这些类型是DOUBLE的同义词,但例外:如果启用了REAL_AS_FLOAT SQL模式,REAL 将是FLOAT 的同义词而非 DOUBLE 的同义词。
·FLOAT(p) [UNSIGNED] [ZEROFILL]
浮点数。p代表精度(比特数),但在MySQL中p仅仅用来判定使用FLOAT还是DOUBLE来存储这个数据类型。如果p是从0到24,那么数据类型就变成了不带M和D的FLOAT型;如果p是从25到53,那么数据类型就变成了不带M和D的DOUBLE型。这个属性列的取值范围,相应地和本节前面描述的单精度FLOAT型、双精度DOUBLE型一样。
提供FLOAT(p)语法是为了ODBC的兼容性。
·DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
MySQL 5.0.3及向上版本:
包装了的”精确“的定点数。M是总的小数位数(精度),D是小数点之后的位数(规模)。小数点和负数的负号"-"不计入M。如果D是0,就没有小数部分。M的最大值是65 (从5.0.3到5.0.5是64),D的最大值是30。M的缺省值是10,D的缺省值是0。
如果指定了 UNSIGNED,负数值将不被接受。
DECIMAL属性列的所有基本计算(+, -, *, /)都采用65位精度值。
在MySQL 5.0.3之前:
没有包装的定点数。它的行为就像CHAR;“没有包装”的意思是这个数是当作一个字符串存储的,用一个字符代表值得一个十进制位。M是总的小数位数,D是小数点之后的位数。小数点和负数的负号"-"不计入M,尽管为它们保留了空间。如果D是0,就没有小数部分。DECIMAL值的最大范围和DOUBLE相同,但给定一个DECIMAL属性列,它的实际范围可能会受到所选的M和D的限制。M的缺省值是10,D的缺省值是0。
如果指定了 UNSIGNED,负数值将不被接受。
·DEC[(M[,D])] [UNSIGNED] [ZEROFILL],NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL],FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
这些类型是DECIMAL的同义词,其中FIXED类型是为了和其他数据库系统兼容。
日期和时间类型简介(Overview of Date and Time Types)
要获取更多信息,参看11.3节"Date and Time Types"。存储需求见11.5节"Data Type StorageRequirements"。
在有关DATETIME和DATE的描述中,“支持”的意思是尽管以前的值还可以工作,但没有任何保证。
SUM()和AVG()集函数不能用于时间值。它们会把时间字符串先转化为数字,这样一来第一个非数字字符后面的部分就丢失了。要避开这个问题,您应当自己把时间转化为数值,然后调用集函数,再把结果转化为时间。例如:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROMtbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROMtbl_name;
·DATE
日期,支持的范围从'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值,但允许你使用字符串或数字对DATE属性列赋值。
·DATETIME
日期和时间的组合,支持的范围从'1000-01-10 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但允许你使用字符串或数字对DATETIME属性列赋值。
·TIMESTAMP[(M)]
时间戳,范围从'1970-01-01 00:00:00'到2037年。TIMESTAMP属性列常用于记录一次INSERT或UPDATE操作的日期和时间。默认的,基本表中的第一个TIMESTAMP类型的属性列会根据最近操作的时间戳自动更新,如果您没有为其赋值的话。你也可以通过给TIMESTAMP属性列赋一个NULL值(译注:NOW()也可以)将其设置成当前日期及时间。各种自动初始化和更新的性质见11.3.1.1节"TIMESTAMP Properties as of MySQL 4.1"。TIMESTAMP值以'YYYY-MM-DD HH:MM:SS'格式的字符串返回,它的显示宽度固定为19个字符。要得到一个数字值,你应该给TIMESTAMP属性列加上"+0"。
·注意:MySQL 5.0不支持MySQL 4.1之前使用的时间戳格式,参看MySQL 3.23, 4.0, 4.1 Reference Manual中有关旧格式的信息。
·TIME
时间,支持的范围从'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式显示TIME值,但允许你使用字符串或数字对TIME属性列赋值。
·YEAR[(2|4)]
用2位数或4位数表示的年份,默认格式是4位数表示。在4位数格式下,YEAR的范围从1901到2155,还包括0000。在2位数格式下,YEAR的范围从70到69,代表从1970年到2069年。MySQL以'YYYY'格式显是YEAR值,但允许你用字符串或数字对YEAR属性列赋值。
字符串类型简介(Overview of String Types)
关于更多信息,参看11.4节“String Types”。存储需求见11.5节“Data Type StorageRequirements”。
一些情况下,MySQL可能把一个字符串属性列的类型改变为不同于在CREATE TABLE或ALTER TABLE语句中给出的类型。见13.1.5.1 “Silent ColumnSpecification Changes”。
在MySQL 4.1及向上版本中,字符串数据类型包含一些你在以前版本(4.1之前)的MySQL中没有遇到过的特征。
·许多字符串类型的列定义可以包含一个CHARACTER SET属性以指定字符集。(CHARSET是CHARACTER SET的同义词)COLLATE属性为字符集指定一个校验。这些属性对CHAR,VARCHAR,TEXT,ENUM,以及SET类型可用。例如:
CREATE TABLE t
(
c1 VARCHAR(20) CHARACTER SET utf8,
c2 TEXT CHARACTER SET latin1 COLLATElatin1_general_cs
);
这个表定义创建了名为c1和c2的两个属性列。c1的字符集为utf8且使用默认效验;c2具有latin1字符集和大小写敏感的效验。
·MySQL 5.0中字符型属性列的长度单位是字符单元。以前,长度是以字节为单位的。
·对于CHAR、VARCHAR和TEXT类型,BINARY属性使此列具有字符集的二进制效验。以前,BINARY使此列存储二进制字符串。
·字符型属性列的排序和比较基于赋给此列的字符集。以前,排序和比较是基于服务器的字符集效验。对于CHAR和VARCHAR类型的列,可以为此列声明一个二进制效验或BINARY属性,这样排序和比较就会使用底层字符码值而非词典顺序。(译注:这里翻译的很勉强,请参看原文)
在第10章“Character Set Support”提供了在MySQL中使用结合的更多信息。
·[NATIONAL]CHAR(M) [BINARY | ASCII | UNICODE]
固定长度的字符串,如果内容长度不足就在右边以空格填充。M代表此字符串的长度,范围是0到255个字符。
注意:检索时末尾的空格会去掉。
在MySQL 5.0.3以前,一个CHAR属性列如果长度定义大于255就会转化为一个足以容纳给定长度的最小的TEXT类型。例如,VARCHAR(500)会被转化为 TEXT 类型,而 VARCHAR(200000) 会被转化为 MEDIUMTEXT类型。这是一个兼容性特征。然而,这种转化会导致此列成为一个变长属性列,且影响末尾空格的去除。
在MySQL 5.0.3及向上版本,如果试图设置一个CHAR的长度大于255,CREATE TABLE或ALTER TABLE语句就会失败并给出一个错误。
mysql>CREATE TABLE c1 (col1 INT, col2 CHAR(500));
ERROR 1074 (42000): Column length too big for column 'col' (max =255); use BLOB or TEXT instead
mysql>SHOW CREATE TABLE c1;
ERROR 1146 (42S02): Table 'test.c1' doesn't exist
CHAR是CHARACTER的缩写。NATIONAL CHAR(或其等价缩写形式NCHAR)是在SQL中定义一个使用预定义字符集的属性列的标准方式。在MySQL 4.1及以上版本中utf8是预定义字符集。参看10.3.6 “National CharacterSet”。
BINARY属性为列指定了二进制效验。这种情况下,排序和比较基于字符的码值大小。
ASCII属性是CHARACTER SET latin1的缩写。
UNICODE属性是CHARACTER SET ucs2的缩写。
CHAR BYTE数据类型时BINARY类型的别名。这是一个兼容性特征。
MySQL运行你创建一个CHAR(0)类型的属性列。当你必须使用一个旧程序,它需要某个列的存在但实际上并不使用这个列的值,这时CHAR(0)类型就非常有用。当你需要一个只取NULL或空字串‘’的属性列时CHAR(0)也很好用。
·CHAR
这个类型是CHAR(1)的同义词。
·[NATIONAL]VARCHAR(M) [BINARY]
变长字符串。M代表它的最大长度。在MySQL 5.0系列中,5.0.3以前M的范围是0到255,5.0.3及以后M的范围是0到65,535。(在MySQL 5.0中一个VARCHAR实际最大长度由最大行尺寸和你使用的字符集决定。最大有效长度从MySQL 5.0.3开始为65,532字节。)
注意:在5.0.3以前,末尾的空格在VARCHAR存储时移除,这和标准SQL说明有所不同。
在MySQL 5.0.3以前,一个VARCHAR属性列如果长度定义大于255就会转化为一个足以容纳给定长度的最小的TEXT类型。例如,VARCHAR(500)会被转化为 TEXT 类型,而 VARCHAR(200000) 会被转化为 MEDIUMTEXT类型。然而,这种转化影响末尾空格的去除。
VARCHAR是CHARACTER VARYING的缩写。
BINARY属性为列指定了二进制效验。这种情况下,排序和比较基于字符的码值大小。
VARCHAR在存储时使用的空间等于所需字符数再加上一个字节用来记录长度(长度声明大于255的话需要两个字节来记录长度)。
·BINARY(M)
BINARY类型和CHAR类型相似,但存储二进制字节序列。
·VARBINARY(M)
VARBINARY类型和VARCHAR类型相似,但存储的是二进制字节序列。
·TINYBLOB
最大长度为255 (28– 1)的BLOB类型。
·TINYTEXT
最大长度为255 (28– 1)的TEXT类型。
·BLOB[(M)]
BLOB属性列的最大长度为65,535 (216– 1)个字节。可选参数M表示BLOB的长度,如果指定了M,MySQL将会创建一个可以容纳M个字节的尽可能小的BLOB。
·TEXT[(M)]
TEXT属性列的最大长度为65,535 (216– 1)个字符。可选参数M表示TEXT的长度,如果指定了M,MySQL将会创建一个可以容纳M个字符的尽可能小的TEXT。
·MEDIUMBLOB
最大长度为17,777,215 (224– 1)个字节的BLOB。
·MEDIUMTEXT
最大长度为17,777,215 (224– 1)个字符的TEXT。
·LONGBLOB
最大长度为4,294,967,295或4GB (232– 1)字节的BLOB。LONGBLOB允许的最大有效长度取决于C/S协议的最大包长度和可用内存。
·LONGTEXT
最大长度为4,294,967,295或4GB (232– 1)字节的TEXT。LONGTEXT允许的最大有效长度取决于的C/S协议的最大包长度和可用内存。
·ENUM('value1','value2',...)
枚举类型。一个字符串对象,但只能取列表'value1''value2'...NULL或空字符串''(错误值)中的一个值。一个ENUM属性列最多可以有65,535中不同的值。ENUM内部表示为整数。
·SET('value1','value2',...)
一个集合。具有0个或多个值的字符串对象,每个值都取自列表'value1' 'value2' ...一个SET最多可以有64个成员。SET内部表示为整数。
数据类型默认值(Data Type Default Values)
DEFAULT分句为一个数据列的定义加上一个默认值。有一个例外是,默认值必须是一个常数,而不能是一个函数或表达式。这意味着,比如,你不能用函数NOW()或者CURRENT_DATE来给一个记录时间的列赋默认值。然而你可以指定一个TIMESTAMP类型的列的默认值为CURRENT_TIMESTAMP。参看11.3.1.1节“TIMESTAMP Properties as of MySQL 4.1”。
在MySQL 5.0.2以前,如果一个列的定义中没有显式指定默认值,MySQL按照以下规则确定默认值:
如果一个列可以取NULL值,MySQL在它的定义中加上DEFAULT NULL分句。
如果一个列不能取NULL值,MySQL不会为它的定义添加DEFAULT分句,而是根据此类型的隐式默认值确定它的默认值:
·对于数值型的列,除过声明了AUTO_INCREMENT属性的,默认值都是0。对一个AUTO_INCREMENT的列,默认值是序列中的下一个值。
·对于非TIMESTAMP的时间类型,默认值是相应类型的“零”值。对于TIMESTAMP类型,默认值是当前时间戳。参看11.3节“Date and Time Types”。
·对于除ENUM之外的字符串类型,默认值为空字符串。对ENUM类型,默认值是第一个枚举值。
BLOB和TEXT属性列没有默认值。
(MySQL 5.0.2以后的)和MySQL 5.0.2一样,如果一个列的定义中没有包括显式DEFAULT值,MySQL按如下原则确定其默认值:
如果一个列可以取NULL值,MySQL为这个列的定义加上DEFAULT NULL分句。这个5.0.2以前一样。
如果一个列不能取NULL值,MySQL在定义这个列时就不包含显式DEFAULT分句。对于数据元素,如果一个INSERT或REPLACE语句不包含任何值,MySQL根据当时的SQL模式处理此列:
·如果没有启用严格SQL模式,MySQL为列设置相应数据类型的隐式默认值。
·如果启用了严格模式,对于交易型基本表,将会产生一个错误并回滚;对于非交易型基本表,产生一个错误,但如果这发生在第二个或多元组语句中的子序列元组,已经处理过的元组就被插入了。
假设一个基本表t定义如下:
CREATE TABLE t (i INT NOT NULL);
这种情况下,i没有显式默认值,所以在严格模式下以下的居于都会产生一个错误且不会插入任何元组。没有使用严格模式时,只有第三个语句会产生错误;对于前连个语句,隐式默认值被插入表中,但第三个因为DEFAULT(i)无法产生一个值所以会失败:
INSERT INTO t VALUES();
INSERT INTO t VALUES(DEFAULT);
INSERT INTO t VALUES(DEFAULT(i));