SQLSERVER int类型只能是有符号整形!

SQLSERVER int类型只能是有符号整形!

http://msdn.microsoft.com/zh-cn/library/ms187745.aspx

int、bigint、smallint 和 tinyint (Transact-SQL)

SQL Server 2014
 
0(共 2)对本文的评价是有帮助 - 评价此主题
 

使用整数数据的精确数字数据类型。

 

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

 

 

 

数据类型

范围

存储

bigint

-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)

8 字节

int

-2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647)

4 字节

smallint

-2^15 (-32,768) 到 2^15-1 (32,767)

2 字节

tinyint

0 到 255

1 字节

注释
 

将整数隐式转换为字符数据类型时,如果整数太大而无法容纳到字符字段中,则 SQL Server 会输入 ASCII 字符 42,即星号 (*)。

大于 2,147,483,647 的整数常量将转换为 decimal 数据类型,而不是 bigint 数据类型。 下面的示例显示当超过此阈值时,结果的数据类型将从 int 变为 decimal。

 
 
SELECT 2147483647 / 2 AS Result1, 2147483649 / 2 AS Result2 ;

下面是结果集:

 
 
Result1      Result2
1073741823   1073741824.500000
示例
 

下面的示例使用 bigint、int、smallint 和 tinyint 数据类型创建一个表。 值插入到每列中并在 SELECT 语句中返回。

 
 
CREATE TABLE dbo.MyTable
(
  MyBigIntColumn bigint
 ,MyIntColumn  int
 ,MySmallIntColumn smallint
 ,MyTinyIntColumn tinyint
);

GO

INSERT INTO dbo.MyTable VALUES (9223372036854775807, 214483647,32767,255);
 GO
SELECT MyBigIntColumn, MyIntColumn, MySmallIntColumn, MyTinyIntColumn
FROM dbo.MyTable;

下面是结果集:

 
 
MyBigIntColumn       MyIntColumn MySmallIntColumn MyTinyIntColumn
-------------------- ----------- ---------------- ---------------
9223372036854775807  214483647   32767            255

(1 row(s) affected)

sd

http://msdn.microsoft.com/zh-cn/library/ms187752.aspx

数据类型 (Transact-SQL)

SQL Server 2014
 
此主题尚未评级 - 评价此主题
 

在 SQL Server 中,每个列、局部变量、表达式和参数都具有一个相关的数据类型。 数据类型是一种属性,用于指定对象可保存的数据的类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。

SQL Server 提供系统数据类型集,该类型集定义了可与 SQL Server 一起使用的所有数据类型。 您还可以使用 Transact-SQL 或 Microsoft .NET Framework 定义自己的数据类型。 别名数据类型基于系统提供的数据类型。 有关别名数据类型的详细信息,请参阅CREATE TYPE (Transact-SQL) 用户定义类型从您使用 .NET Framework 支持的编程语言之一创建的类的方法和运算符中获取它们的特征。

当两个具有不同数据类型、排序规则、精度、小数位数或长度的表达式通过运算符进行组合时,结果的特征由以下规则确定:

  • 结果的数据类型是通过将数据类型的优先顺序规则应用到输入表达式的数据类型来确定的。 有关详细信息,请参阅数据类型优先级 (Transact-SQL)

  • 当结果数据类型为 char、varchar、text、nchar、nvarchar 或 ntext 时,结果的排序规则由排序规则的优先顺序规则确定。 有关详细信息,请参阅排序规则优先级 (Transact-SQL)

  • 结果的精度、小数位数及长度取决于输入表达式的精度、小数位数及长度。 有关详细信息,请参阅精度、小数位数和长度 (Transact-SQL)

SQL Server 提供了数据类型同义词以与 ISO 兼容。 有关详细信息,请参阅数据类型同义词 (Transact-SQL)

SQL Server 中的数据类型归纳为下列类别:

 

精确数字

Unicode 字符串

近似数字

二进制字符串

日期和时间

其他数据类型

字符串

 

在 SQL Server 中,根据其存储特征,某些数据类型被指定为属于下列各组:

  • 大值数据类型:varchar(max)、nvarchar(max) 和 varbinary(max)

  • 大型对象数据类型:text、ntext、image、varchar(max)、nvarchar(max)、varbinary(max) 和 xml

    注意 注意

    sp_help 返回 -1 作为大值数据类型和 xml 数据类型的长度。

精确数字

近似数字

 

日期和时间

字符串

 

Unicode 字符串

二进制字符串

其他数据类型

地方

http://www.cnblogs.com/MYSQLZOUQI/articles/3837100.html

2.7.2 类型溢出

举例

MySQL5版本,int类型为例:

#建表

root@localhost(test2)14:46>create table test2 (a int(10) UNSIGNED);

Query OK, 0 rows affected (0.12 sec)

#插入数据

root@localhost(test2)14:56>insert test2 values (10);

Query OK, 1 row affected (0.00 sec)

#模拟更新溢出

root@localhost(test2)14:56>update test2 set a=a-11;

Query OK, 1 row affected, 1 warning (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 1

#查看warnings

root@localhost(test2)14:57>show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1264 | Out of range value for column 'a' at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

#确定实际得到的值已经溢出

root@localhost(test2)14:57>select * from test2;

+------------+

| a          |

+------------+

| 4294967295 |

+------------+

1 row in set (0.00 sec)

#清理数据

root@localhost(test2)14:59>delete from test2;

Query OK, 1 row affected (0.00 sec)

#模拟插入溢出

root@localhost(test2)14:59>insert test2 values (-1);

Query OK, 1 row affected, 1 warning (0.00 sec)

#查看warnings

root@localhost(test2)14:59>show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1264 | Out of range value for column 'a' at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

#确定实际得到的值已经溢出

root@localhost(test2)14:59>select * from test2;

+------+

| a    |

+------+

|    0 |

+------+

1 row in set (0.00 sec)

原因

int占用4个字节,而int又分为无符号型和有符号性。对于无符号型的范围是到 4294967295;有符号型的范围是-2147483648 到 2147483647

举一反三,其他类型都可能有类似问题,均需要考量。

控制方法

可以通过sql_mode参数控制,但一般建议程序控制,比如:对表单项的值进行校验。

 

posted @ 2014-07-11 10:45  huangchaolilli  阅读(1660)  评论(0)    收藏  举报