mysql 数据类型java类型对照

mysql数据库 JDBC 对照
类型名称显示长度数据库类型 JAVA类型JDBC类型索引(int)描述
      
VARCHARL+NVARCHAR java.lang.String12 
CHARNCHAR java.lang.String1 
BLOBL+NBLOB -4 
TEXT65535VARCHAR java.lang.String-1 
      
INTEGER4INTEGER UNSIGNED java.lang.Long4 
TINYINT3TINYINT UNSIGNED java.lang.Integer-6 
SMALLINT5SMALLINT UNSIGNED java.lang.Integer5 
MEDIUMINT8MEDIUMINT UNSIGNED java.lang.Integer4 
BIT1BIT java.lang.Boolean-7 
BIGINT20BIGINT UNSIGNED java.math.BigInteger-5 
FLOAT4+8FLOAT java.lang.Float 7 
DOUBLE22DOUBLE java.lang.Double8 
DECIMAL11DECIMAL java.math.BigDecimal3 
BOOLEAN1同TINYINT   
      
ID11PK (INTEGER UNSIGNED) java.lang.Long4 
      
DATE10DATE java.sql.Date91 
TIME8TIME java.sql.Time92 
DATETIME19DATETIME java.sql.Timestamp93 
TIMESTAMP19TIMESTAMP java.sql.Timestamp93 
YEAR4YEAR java.sql.Date91

要获取更多信息,参看11.2节“Numeric Types”。存储需求见11.5节“Data Type Storage Requirements”。

M 表示最大显示宽度(maximum display width),最大显示宽度的合法值不超过255。显示宽度与存储尺寸、取值范围无关,这在第11.2节"Numeric Types"中有说明。

如果您在数值型属性列中指定了ZEROFILL属性,MySQL自动为此列添加UNSIGNED属性。

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。

整数属性列定义中的SERIAL DEFAULT VALUENOT NULL AUTO_INCREMENT UNIQUE的别名。

警告: 如果您在做减法运算时其中一个操作数是UNSIGNED类型,那么结算结果也是无符号的,参看12.8节"Cast Functions and Operators"。

  • BIT[(M)]

    位域类型。M 表示每个值的比特数,从1到64,缺省为1。

    这个数据类型是为 MyISAM 加入到 MySQL 5.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]

    大整数,有符号型的范围是 -92233720368547758089223372036854775807,无符号型的范围是 018446744073709551615

    关于 BIGINT 属性列,以下事情你必须清楚:

    • 所有算术都是用有符号的 BIGINT 或 DOUBLE 值做计算的,所以不要使用大于9223372036854775807 (63位)的大整数,除非用在位运算函数中。否则,计算结果的最后几位数可能错误,因为从 BIGINT 向 DOUBLE 转化时会产生舍入误差。

      MySQL 在以下情形中使用 BIGINT:

      • 在 BIGINT 属性列中使用整数(而不是浮点数)来存储大的无符号值时。

      • 在 MIN(col_name) 或 MAX(col_name) 函数中,col_name 引用了 BIGINT 属性列。

      • 当使用运算符(+ - * 等等)时两个操作数都是整数。

    • 通过存入一个字符串,总能够在 BIGINT 属性列中存入一个精确的整数值。这种情况下,MySQL 进行字符串向数字的转化,转化过程不会引入双精度中间表示。

    • - + * 运算符在两个操作数都是整数值时使用 BIGINT 做运算。这意味着当两个大整数相乘(或者从返回整型值的函数取得结果)时,如果结果大于 9223372036854775807 就可能会得到意想不到的后果。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    小型(单精度)浮点数。允许值包括 -3.402823466E+38-1.175494351E-380,以及 1.175494351E-383.402823466E+38。这些都是理论极限,基于 IEEE 标准。真实范围可能要小一些,取决于硬件和操作系统。

    M 是总的小数位数,D 是小数点之后的位数。如果省略了 MD,值将会按照硬件的允许的范围存储。单精度浮点数具有大约 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-3081.7976931348623157E+308。这些都是理论极限,基于 IEEE 标准。真实范围可能要小一些,取决于硬件和操作系统。

    M 是总的小数位数,D 是小数点之后的位数。如果省略了 MD,值将会按照硬件的允许的范围存储。双精度浮点数具有大约 15 位有效数字

    如果指定了 UNSIGNED,负数值将不被接受。

  • DOUBLE PRECISION[(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,那么数据类型就变成了不带 MD 的 FLOAT 型;如果 p 是从 25 到 53,那么数据类型就变成了不带 MD 的 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属性列,它的实际范围可能会受到所选的 MD 的限制。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 Storage Requirements"。

在有关DATETIME和DATE的描述中,“支持”的意思是尽管以前的值还可以工作,但没有任何保证。

SUM() AVG() 集函数不能用于时间值。它们会把时间字符串先转化为数字,这样一来第一个非数字字符后面的部分就丢失了。要避开这个问题,您应当自己把时间转化为数值,然后调用集函数,再把结果转化为时间。例如:

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_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 Storage Requirements”。

一些情况下,MySQL可能把一个字符串属性列的类型改变为不同于在 CREATE TABLEALTER TABLE 语句中给出的类型。见13.1.5.1 “Silent Column Specification Changes”。

在MySQL 4.1 及向上版本中,字符串数据类型包含一些你在以前版本(4.1之前)的MySQL中没有遇到过的特征。

  • 许多字符串类型的列定义可以包含一个 CHARACTER SET 属性以指定字符集。(CHARSETCHARACTER SET 的同义词)COLLATE 属性为字符集指定一个校验。这些属性对 CHAR,VARCHAR, TEXT,ENUM,以及SET类型可用。例如:

    CREATE TABLE t
    (
    c1 VARCHAR(20) CHARACTER SET utf8,
    c2 TEXT CHARACTER SET latin1 COLLATE latin1_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 Character Set”。

    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 类型,默认值是第一个枚举值

BLOBTEXT属性列没有默认值

 

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));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值