从 SQL Server 到 My SQL

来源:互联网 发布:查网站域名是否被注册 编辑:程序博客网 时间:2024/06/05 22:35
MS SQL Server对于程序开发人员来说都不陌生,它功能强大且使用方便,无论你是做个人的小型软件还是企业的大型系统,选择它你都不会觉得后悔。然而,它也有它的局限性,那就是费用,几万到几十万元一夽的价格,对谁来说都不是一个小数目。唉,难道天下就真的没有免费的午餐了?有,这个真的可以有:MySQLMySQL就是一款开源的数据库,承诺永久免费,而且小巧,灵便。据我的研究,对于一般规模的系统,它的功能足以满足我们的需要,对于数百万甚至上千万条的数据,它也能应付自如。既然有这么好的免费午餐,我们没理由不选择呀。那么从SQL Server MySQL,我们需要注意些什么呢?下面就是我发现的一些值得注意的地方:
一、数据迁移
如果我们以前使用的是SQL Server,数据结构以及大量数据都存在于SQL Server中,现在要改用MySQL了。怎么才能把数据库从SQL Server 迁移到 MySQL呢?你可以在My SQL中重新构建一个一模一样的空数据库,然后用程序代码把数据从SQL Server中读出再写入MySQL中。这种方法当然不会有错,然而有更方便的方法:SQL Server有导入导出功能,我们可以使用它的导出功能,将SQL Server中的数据完整的导出到MySQL中。具体流程是:
1、在MySQL中建一空数据库
2、在ODBC中建一连接该数据库的DSN数据源(前提是先安装MySQLODBC驱动,可以从网上下载。)
3、打开SQL Server的数据导出功能
选择要导出的源数据库
选择导入到的数据库,这里是MySQL ODBC
选择DSN,输入用户及密码
    这一步选择要导出的数据表,这里有一个需要注意的地方,就是SQL Server与MySQL的数据类型有一定的不同,有时自动转换不一定最恰当的,可能需要手支对应一下。如下图:
    每一个表都对应完成后,即可到一步,最后点击完成,系统就会把SQL Server数据库里的表一个个导入到我们的MySQL中。至此,我们就成功的将数据库迁移到MYSQL了。
二、数据操作
MySQLSQL语名与SQL ServerSQL语句有些不同的地方,在SQL Server中我们可能用到一些它自己的函数,比如Grouping,Isnull等,这些函数在MySQL中是不支持的,所以如果在开发中用到了这些函数,我们就要想办法用别的方法到实现这些函数的功能。到目前为止,我总结了以下几点不同:
1、在SQL Server中,如果表名以数字开头,在SQL语句中我们需要在用“[”和“]”将表名括起来,例如:select * from [7newtemp]。但在MySQL中,它是不需要任何处理的,如:select * from 7newtemp,相反,这么做了反而会出错。
2、在SQL Server中常用的Select Top n MySQL中是不支持的,取而代之的是Limit n1,n2,但Limit在语法和功能上是与Top有很大不同的:首先,limit n1,n2必须放在整个SQL语句的最后,其次,Limit n1,n2取的不仅仅是前多少条,它可以取得记录集中的任意一个区段,从n1(包括n1)开始,到n2(不包括n2)结束。如果我们要取前10条记录,在SQL Server中应该这么写:select top 10 * from [7newtemp],而在MySQL中我们应该这么写:select * from 7newtemp limit 0,10
3、在多表联合查找时,我们经常要给表一个别名,如:select A.*,B.Uid from 7newtemp A,Table2 B where A.uid=B.uid。这是在SQL Server中的写法,如果在MySQL中,我就应该这么写:select A.*,B.Uid from 7newtemp as A,Table2 as B where A.uid=B.uid
4、在MySQLGroup byOrder by 不能同时使用。
以上是我总结的SQL ServerMySQL在操作上的几点区别,应该还有其它的区别,我会在以后的工作中继续发现,总结,再写出来。目的只有一个:那就是让同仁们在从SQL Server转向MySQL时少走弯路。
    以下是一个MySQL的分组统计的例子,想想看,在SQL Server中是怎么写的,区别在哪儿。
1.创建表:
    create table groupTable(dept varchar(6),phone varchar(20),amount int);
2.
插入测试数据:
    insert groupTable
    select '
营业部',8001,20 union all
    select '
营业部
',8002,30 union all
    select '
财务部
',6001,10 union all
    select '
财务部
',6003,100;
3.
mysql 语句:

    select ifnull(dept,'
总计') as '部门',ifnull(phone,'小计') as '电话',sum(amount ) as '金额' from groupTable group by
    dept,phone with rollup;
4.
结果显示:

+--------+------+------+
|
部门  | 电话| 金额 |
+--------+------+------+
|
财务部 | 6001
|   10 |
|
财务部 | 6003
| 100 |
|
财务部 |小计 
| 110 |
|
营业部 | 8001
|   20 |
|
营业部 | 8002
|   30 |
|
营业部 | 小计
|   50 |
|
总计   |小计
| 160 |
+--------+------+------+