Sqlserver中 Identity的类型是int ,你写int id = (int) reader["id"]肯定没问题。
但是Mysql中自增长是AUTO_INCREMENT, 他的类型是long
所以你要写long id = (long)reader["id"]或者 var id = Convert.ToInt64(reader["id"])
我们在设计表的时候,如果碰到需要设置int(整型)的时候,通常会按照惯例(大家都这样写)设置成int(11)。那么这里为什么是11呢?代表的又是什么呢?以前我一直以为这里是在限制int显示的宽度,后来仔细研究和通过上网查询发现,事实并不是那样的。
确切的来说,这里的“宽度”只是一个“预期值”,它所代表的仅仅是你在设计数据表结构时,想让该列日后显示的值宽度为多少,但是具体存入值的宽度多少不会受任何影响。
当然,它的作用不仅如此,在存入数据的时候,还是有一定区别的,这一点可以通过设置字段的zerofill可以看出。比如这里我们创建一个数据表,结构如下:
create
table
test
(
num
int(5)
zerofill
)
上面代码创建一个名为test的表,结构很简单,表中只有一个名为num的字段,类型为int,宽度为5,为了看出宽度方便,我们又添加一个zerofill属性(该属性会让存入数值在不足宽度情况下,左侧补0)
然后我们开始插入数据:
mysql>
insert
into
test
values(1),(11),(123),(12345),(123456),(1234567)
Query
OK,
6
rows
affected
(0.00
sec)
Records:
6
Duplicates:
0
Warnings:
0
打印结果:
mysql>
select
*
from
test
+---------+
|
num
|
+---------+
|
00001
|
|
00011
|
|
00123
|
|
12345
|
|
123456
|
|
1234567
|
+---------+
6
rows
in
set
(0.00
sec)
由以上结果,不难看出,如果字符少于设置(期望值)宽度,在设置了zerofill属性的情况下,左侧会统统补0;但是如果超出则不受任何影响。也就是说这里的int(m)中m只是一个预期值,和真实数据宽度并没多大关系。
MYSQL在创建索引后对索引的使用方式分为两种:1 由数据库的查询优化器自动判断是否使用索引;
2 用户可在写SQL语句时强制使用索引
下面就两种索引使用方式进行说明
第一种,自动使用索引。数据库在收到查询语句后会查看where语句后面的查询条件,同时查看在表上面有哪些索引,然后根据查询条件和索引进行匹配。
查询条件和索引的匹配包括查询字段与索引字段的匹配和查询类型和索引类型的匹配。前者很好理解,就是查询条件的属性上要建有索引,后者则是说查询条件必须能够使用索引,比如等值判断和范围查询可以使用B+树索引,而hash索引只能适用于等值判断。
在找到与查询条件匹配的索引后,就是进行代价估计来决定是否使用索引,代价估计主要根据要访问的就数量,一般来说如果通过索引访问的记录数量占全表记录数量15%以上,则不会使用索引而是使用全表扫描,因为此时使用索引的代价更大。在大多数情况下使用索引是会提高效率的。
经过优化器的判断,最终会决定是否使用索引
第二种,强制使用索引,主要是通过SQL语句实现的
select * from table force index(PRI) limit 2(强制使用主键)
select * from table force index(ziduan1_index) limit 2(强制使用索引"ziduan1_index")
select * from table force index(PRI,ziduan1_index) limit 2(强制使用索引"PRI和ziduan1_index")
也可以禁止索引的使用
select * from table ignore index(PRI) limit 2(禁止使用主键)
select * from table ignore index(ziduan1_index) limit 2(禁止使用索引"ziduan1_index")
select * from table ignore index(PRI,ziduan1_index) limit 2(禁止使用索引"PRI,ziduan1_index")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)