MySQL和SQL Server存储过程写法上的区别
发布时间:2025-05-12 12:29:47 发布人:远客网络
一、MySQL和SQL Server存储过程写法上的区别
1、一、多数指令是相同的,包括创建和修正存储过程的指令。
2、二、很多细微的指令有不同,具体如下(不仅):
3、1 mysql支持enum,和set类型,sql server不支持
4、2 mysql不支持nchar,nvarchar,ntext类型
5、3 mysql的递增语句是AUTO_INCREMENT,而mssql是identity(1,1)
6、MYSQL:create table basic(id int key auto_increment,name varchar(20));
7、 MSSQL: create table basic(id int identity(1,1), name varchar(20))
8、4 msms默认到处表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的
9、6 mssql识别符是[],[type]表示他区别于关键字(可选用来包含表名、字段名),但是mysql却是 `(重音符,也就是按键1左边的那个符号)
10、7 mssql支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数
11、8 mssql不支持replace into语句,但是在最新的sql20008里面,也支持merge语法
12、9 mysql支持insert into table1 set t1=‘’, t2=‘’,但是mssql不支持这样写
13、10 mysql插入多行支持这样写 insert into tabl1 values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1) MSSQL不支持
14、11 mssql不支持limit语句,是非常遗憾的,只能用top取代limt 0,N,row_number() over()函数取代limit N,M
15、12 mysql在创建表时要为每个表指定一个存储引擎类型,而mssql只支持一种存储引擎
16、13 mysql不支持默认值为当前时间的datetime类型(mssql很容易做到),在mysql里面是用timestamp类型
17、14 mssql里面检查是否有这个表再删除,需要这样:
18、 exists(select* from dbo.sysobjects where id=
19、 object_id(N'uc_newpm') and OBJECTPROPERTY(id, N'IsUserTable')
20、但是在mysql里面只需要 DROP TABLE IF EXISTS cdb_forums;
21、15 mysql支持无符号型的整数,那么比不支持无符号型的mssql就能多出一倍的最大数存储
22、16 mysql不支持在mssql里面使用非常方便的varchar(max)类型,这个类型在mssql里面既可做一般数据存储,也可以做blob数据存储
23、 mysql创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder(fid,displayorder)
24、在mssql里面必须要:create unique nonclustered index
25、index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers
26、18 mysql text字段类型不允许有默认值
27、19mysql的一个表的总共字段长度不超过65XXX。
28、20一个很表面的区别就是mysql的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....
29、21mysql的管理工具有几个比较好的,mysql_front,和官方那个套件,不过都没有SSMS的使用方便,这是mysql很大的一个缺点。
30、22mysql的存储过程只是出现在最新的版本中,稳定性和性能可能不如mssql。
31、23同样的负载压力,mysql要消耗更少的CPU和内存,mssql的确是很耗资源。
32、24php连接mysql和mssql的方式都差不多,只需要将函数的mysql替换成mssql即可。
33、25mysql支持date,time,year类型,mssql到2008才支持date和time。
34、MYsql:变量赋值SELECT@min_price:=MIN(price),@max_price:=MAX(price) FROM shop
35、 MSsql:变量赋值SELECT@min_price=MIN(price),@max_price=MAX(price) FROM shop
36、三、总的来说,如果是简单的存储过程代码,要修改,不会太难。如果是复杂的系统,要移植会很难很难。
二、什么是存储过程有什么优点
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。
1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
1、更改比较繁琐:如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新 GetValue()调用,等等,这时候估计比较繁琐。
2、可移植性差:由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则需要将业务逻辑封装在不特定于 RDBMS的中间层中。
参考资料来源:百度百科-存储过程
三、如何用python连接mysql数据库
1、MySQL数据库要用MySQLdb模块,但Python用来链接MySQL的第三方库MySQLdb不支持Python3.x
特别说明:我在我的电脑上实验时,我的python是2.7.2版本,安装对应版本的MySQLdb之后直接可以运行,并与数据库连接成功,所以如果大家也像我一样顺利的话,下面的就不需要看了,直接跳过,看第2点如何执行sql语句即可!如果安装之后出现异常,可以参考一下下面的解决办法。
连接的关键是安装MySQLdb模块要下载与Python相对应的版本:
下载好后安装,它会自动检测到计算机Python的安装路径,并自动填写模块解压路径(我的是:D:\ProgramFiles\ActivePython 2.6.6.17\Lib\site-packages\)。
但解压完成后并不能使用,还要修改MySQLdb模块下的一些文件:
①.在MySQLdb目录下(我的是:D:\ProgramFiles\ActivePython 2.6.6.17\Lib\site-packages\MySQLdb)找到__init__.py:
注释第34、35行的from setsimport ImmutableSet、class DBAPISet(ImmutableSet):,在后面添加class DBAPISet(frozenset):
# from sets import ImmutableSet
# class DBAPISet(ImmutableSet):
注释第37行的from sets import BaseSet, Set,将第45行的return Set([ i for i in s.split(',') ifi ])中的Set改为set;同样将第129行的Set: Set2Str,中的Set改为set(不要修改Set2Str),到这里就修改完毕了
conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable")
host:连接的数据库服务器主机名,默认为本地主机(localhost)。
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值.
port:MySQL服务使用的TCP端口.默认是3306.
conn连接有两个重要的方法commit【提交新增和修改】,rollback【撤销新增或修改】
我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.
这些方法包括两大类:1.执行命令,2.接收返回值
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.
#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql="insert into cdinfo values(%s,%s,%s,%s,%s)"
param=(title,singer,imgurl,url,alpha)
cursor.execute("select* from cdinfo")
#我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
#因为是tuple,所以可以这样使用结果集
#或者直接显示出来,看看结果集的真实样子
#如果需要批量的插入数据,就这样做
sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"
#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法来批量的插入数据.这真是一个很酷的方法!
n=cursor.executemany(sql,param)
需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保存在数据库中.我不清楚是否是我的mysql设置问题,总之,今天我在一开始使用的时候,如果不用commit,那数据就不会保留在数据库中,但是,数据确实在数据库呆过.因为自动编号进行了累积,而且返回的受影响的行数并不为0.
需要分别的关闭指针对象和连接对象.他们有名字相同的方法
1 Python文件设置编码 utf-8(文件前面加上#encoding=utf-8)
3 Python连接MySQL是加上参数 charset=utf8
4设置Python的默认编码为 utf-8(sys.setdefaultencoding(utf-8)
sys.setdefaultencoding('utf-8')
db=MySQLdb.connect(user='root',charset='utf8')
注:MySQL的配置文件设置也必须配置成utf8
Con= MySQLdb.connect(host='localhost',user='root',passwd='root',db='abc')
sql="insert into【table】(字段,字段) values(值,值)"
sql="update【table】 set字段=‘值’where条件"
sql="delete from【table】where条件"
cur.execute('select* from tables')
其返回值为SQL语句得到的行数,如:2L,表示2行。
然后,可以从该对象的fetchone或fetchall方法得到行信息。
指针对象的fetchone()方法,是每次得到一行的tuple返回值:
>>> row=cur.fetchone()
('user1','52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L,'/home/FTP/user1','')
指针对象的fetchall()方法,可取出指针结果集中的所有行,返回的结果集一个元组(tuples):
>>> cur.scroll(0,'absolute')
>>> row=cur.fetchall()
(('user1','52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L,'/home/FTP/user1',''),('user2','7e58d63b60197ceb55a1c487989a3720', 1000L, 1000L,'/home/FTP/user2', None))
当使用fetchone()方法是,指针是会发生移动的。所以,若不重置指针,那么使用fetchall的信息将只会包含指针后面的行内容。
int:移动的行数,整数;在相对模式下,正数向下移动,负值表示向上移动。
parm:移动的模式,默认是relative,相对模式;可接受absoulte,绝对模式。
修改数据,包括插入、更新、删除。它们都是使用指针对象的execute()方法执行:
cur.execute("insert into table(row1, row2) values('111','222')")
cur.execute("update table set row1='test' where row2='row2'")
cur.execute("delete from table where row1='row1'")
因单引号“'”用于SQL语句中的标识,所以,python中的字符串需使用双引号括住。
此外,也可以使用python的“格式化字符串”写法,简化命令,例如:
cur.execute("update table set row1='%s' where row2='%s'"%('value1','value2'))
※请注意,'%s'的单引号是SQL语句的间隔符,'value1'的单引号是python的字符串间隔符,其含义是不同的。是否需要间隔符,以及使用双引号还是单引号作为间隔,需根据其含义决定。例如,还有:
cur.execute("update FTPUSERS set passwd=%s where userid='%s'"%("md5('123')",'user2'))
这里,paswd=%s是因SQL的md5()函数是不需要单引号间隔的;"md5('123')"是python的字符串中含有单引号,所以用双引号括住。
一般情况下,MySQLdb模块会自动提交修改。但我们在更新数据后,手动运行一次:
需要分别的关闭指针对象和连接对象.他们有名字相同的方法