MYSQL,DB2,SQLSERVER数据库不同点浅探(一)

简单地比较一下MYSQL,DB2,SQLSERVER数据库设计不同点,为日后看MYSQL源代码先打打底,今天先比较数据库对象吧:

1.DB2上关于表有一个表空间的概念,简单地说, 表空间是数据库系统中数据库逻辑结构与操作系统物理结构之间建立映射的重要存储结构,一般来说一个表空间对应一个表.DB2在表空间上分配表空间对应表的一切物理属性,比如首次分配大小,扩展大小,页面每页初始空闲空间,空闲页面占总页面百分比等.因此,DB2上的系统DBA对表的操作更多是基于表空间上.比如因为表上的删改查不可避免地会造成表页面的碎片,DBA要定期对这些碎片进行清理,DBA实际操作的是重组表空间(同时顺带重组索引). DBA对表的备份实际也是通过对表空间的备份实现. 所以DB2上表的恢复可以通过恢复表空间文件或日志文件实现单表恢复,在这一点上DB2优于SQLSERVER.

SQLSERVER上关于表并没有比表空间的概念,物理信息是通过数据库所在文件或者文件组实现.SQLSERVER上也有索引碎片和定期重组/重建索引的需求.SQLSERVER DBA 可通过DMV视图去查询当前索引的碎片量,一般高于30%的索引则必须重建索引;低于30%的索引则可通过重组来处理.(基准一般由项目而定).所以SQLSERVER上定期对索引的维护一般是重建索引

MYSQL存储上也有碎片的概念,但据官方文档,这种碎片并不是因为一般数据删改查而造成,而是因为MYSQL内部中使用VARCHAR,TEXT,BLOB等可变长度的数据类型删改查造成.(-_-!删改查中的霸主,也是删改查),MYSQL上使用OPTIMIZE TABLE进行碎片整理,主要使用在MYISAM上.

其他DB2,SQLSERVER,MYISAM上面的管理维护在下一篇文章讨论.

2. 关于聚集索引和非聚集索引:

SQLSERVER与DB2中存在聚集索引概念,你可以使用语句显式创建聚集索引(加参数CLUSTERED);MYSQL中不存在显式的聚集索引和非聚集索引, INNODB引擎下主键索引即为聚集索引,MYISAM下面没有聚集索引.

MYSQL中除了与SQLSERVER,DB2中类似的普通索引,单列索引,组合索引(后两者在SQLSERVER与DB2中并不叫此称谓但用法类似),全文索引(仅使用在MYISAM引擎)外,还存在特殊的空间索引.空间索引主要利用在GIS,几何数学计算等方面. DB2中没有空间索引,SQLSERVER中存在空间索引,但用法上跟MYSQL略有不同.

3. 视图,系统表.

应用视图没什么可说的,三者创建语句都基本一致.系统表也差不多,每个数据库基本都提供系统表去查询当前数据库中应用数据库的系统信息,比如表结构,表名,表的物理信息,SCHEMA信息,用户信息,约束信息,存储过程信息等等. SQLSERVER还提供了动态管理视图(DMV), DBA可利用DMV查询当前运行的QUERY,当前TASK利用CPU信息,当前运行最慢的SQL,当前的死锁或阻塞等. DMV对SQLSERVER DBA非常重要,每个DBA都要掌握.

4. 在系统内置函数上,MYSQL,SQLSERVER,DB2基本差不多,常用字符处理函数CONCAT,STRCMP,SUBSTRING,REVERSE,LTRIM,RTRIM,REPLACE等均存在或存在类似功能于MYSQL,SQLSERVER,DB2平台上.

5. 触发器和存储过程:

MYSQL,DB2中触发器上均有对旧表和新表的标识和操作,SQLSERVER上没有.

SQLSERVER上触发器语法中可涉及对列的监控,比如 ‘IF UPDATE(A1)’ 标明如果A1列被更新,则做相应的操作;MYSQL, DB2上没有,只能通过,NEW,OLD比较来实现.

MYSQL触发器的触发级别包括AFTER和BEFORE,SQLSERVER包括 AFTER和INSTEAR OF,DB2则包含这三种.

MYSQL触发器语法中包含’FOR EACH ROW‘这种显示触发器颗粒度语句,SQLSERVER触发器语法上没有,但实际执行也是遵循’FOR EACH ROW’. DB2 上还有’FOR EACH STATEMENT’选项,不过仅适用于激活级别是AFTER的时候.

存储过程创建语法,调用目的,编译基本都差不多,只不过调用方法SQLSERVER 用’EXEC‘,MYSQL和DB2上用’CALL’而已. 目前据知乎消息,阿里这种国内顶尖互联网公司已经内部禁止使用存储过程了(我没有亲见,争取过几年进阿里感受感受).

6. 数据类型:

MYSQL中数据类型INT,SMALLINT等整型后面可加数字,该数字表示显示的宽度,但该宽度并不影响实际取值范围.比如INT(4),如果输入不到4位的,会用空格填充;大于4位的,大于4的,显示其实际数值. DB2,SQLSERVER中没有这种所谓数据类型宽度的设计.

MYSQL 的日期时间类型比SQLSERVER,DB2都丰富.

SQLSERVER中的日期时间类型有: DATA,TIME,DATATIME;

DB2中的日期时间类型有: DATA,TIME,TIMESTAMP;

MYSQL中的相关日期时间类型有: YEAR,DATE,TIME,DATETIME,TIMESTAMP

另外 : YEAR类型上 MYSQL 对4位数字或字符,2位数字,2位字符的处理方式不同,具体可参照说明文档.

7.  MYSQL中可以使用语句手动更改数据引擎;SQLSERVER,DB2中没有这一设置. (SQLSERVER针对不同的服务提供不同的引擎,比如对分析服务提供的引擎就与基本管理服务中不一样. DB2统一使用默认的引擎)

8. 其他一些SQL查询的细节:

MYSQL 插入新列支持将新列插入到最前面(参数FIRST)或某指定字段的后面(AFTER), SQLSERVER,DB2默认只允许新列插入到最后. SQLSERVER中允许使用设计图形界面将新列插入到某列后面,实际原理是先生成一个和修改后的表一样的临时表,将原来的表中的数据放到临时表中,再将原来的表删掉.(辛苦了,SQLSERVER-_-!)

MYSQL中支持RENAME语句直接将表名改为另一个名字,语法如下:

ALTER TABLE OLDANAME RENAME newname;允许用ALTER TABLE … CHANGE的方式修改列名. CHANGE同样可以修改新列的数据类型.

SQLSERVER中不支持直接用语句修改,允许调用存储过程 ‘sp_rename’去修改表名,同样用该存储过程可以用来修改列名.

DB2中可以用RENAME … TO来修改表名,用ALTER TABLE语句修改表中列名属性,但不允许直接修改列名,只允许删除后添加不同列名的方式.

MYSQL中使用LIMIT关键字查询表中开头或从m行开始的n行数据,SQLSERVER中支持TOP关键字以查询开头多少行的数据,DB2中使用’FETCH FIRST n rows only’来查询开头多少行的数据. 后两者并不支持简单用QUERY 语句去查询m行开始的n行数据(目前的个人看法)

9. 其他一些设置,如运算符,约束,系统函数大致一样.

时间: 05-27

MYSQL,DB2,SQLSERVER数据库不同点浅探(一)的相关文章

mysql 导入sqlserver数据库

#mysql 导入sqlserver数据库 EXEC master.dbo.sp_addlinkedserver @server = N'sjkxb00', @srvproduct=N'MySQL', @provider=N'MSDASQL', @provstr=N'DRIVER={MySQL ODBC 5.3 Unicode Driver}; SERVER=localhost; _DATABASE=tigerdb; USER=root; PASSWORD=123456; OPTION=3' -

MYSQL同步Sqlserver数据库数据

MYSQL同步sqlserver数据库数据的方法. 1.下载安装SQLyog v10.51,确保本机安装了Mysql和Sql server 2008 r2. 2.使用SQLyog连上本地mysql数据库 3.点数据库>导入>导入外部数据 进入SQLyog外部数据导入向导,选择"开始新的工作",点"下一步" 4.在数据源类型中只有access.excel.csv.任何odbc数据源.使用前面三个中间数据格式转换方式都可以导入不过就麻烦了.这里我们选择任何O

mysql导入sqlserver数据库表

原文:https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中,创建目标数据库(注意:因为是点对点的数据导入,要求sql server 中要导出的数据库名称和要导入到Mysql 中的数据库的名字相同) 点击创建好的目标数据库website点的”表“一项,在右边会出现导入向导选项. 选择SQL Server数据库ODBC,“下一步”,数据链接属性-SQL SERVER ODBC 创建访问SQ

mysql 、sqlserver数据库,实时同步,增量同步(脚本模式)

数据集成(Data Integration)产品提供数据同步服务,有向导模式和脚本模式两种方式.向导模式更简单,脚本模式更灵活. 本章介绍如何将Table Store中的增量数据通过数据集成的脚本模式同步到OpenSearch中. 途径 数据集成脚本模式 Reader:OTSStreamReader Writer:OSSWriter 配置Table Store 无需配置. 配置OSS 无需配置. 配置数据集成 创建Table Store数据源. 说明 如果已经创建了Table Store的数据源

MySQL机sqlserver注射和php注入

最近在学习MySQL和sqlserver数据库,由于我的专业是信息安全,所以把web安全涉及到的注入全部总结了一下,里面涉及到内容比较多.希望想学习的提前要对这两种数据库有一定了解,才能更好的学习盲注. 1)database(),version(),user() union联合查询,因为只有版本大于4.0,才会支持union查询 .并且只有两个表列数相同时,才会返会正确的表. 有一个information_schema数据库,库里面有一个 http://www.a.com/cms/new.php

各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包

在开发基于数据库的应用系统时.须要在项目中进行数据源的配置来为数据 库的操作取得数据库连接. 配置不同数据库的数据源的方法大体上都是同样的.不同的仅仅是不同数据库的JDBC驱动类和连接URL以及对应的数据库username和密 码不同.以下列出8中经常使用的数据库的数据库数据源配置和对应的JDBC驱动包. 1.Spring中数据源配置格式 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSour

MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数.例如:select * from table WHERE … LIMIT 10; #返回前10行select * from table WHERE … LIMIT

C#连接Access数据库,C#连接Excel数据库,C#连接SqlServer数据库,C#连接Mysql数据库总结

大二下学期写的了,如今毕业一个月了,整理整理 额,以前写的好幼稚,只有自己明白了,网上一大堆,大概的意思说下吧 MySQL========================================= http://user.qzone.qq.com/652768664/blog/1347859952 连接mysql需要安装mysql,在mysql的C盘安装目录有一个连接 lib,将改lib添加引用用项目OK; static void Main(string[] args) { List<s

怎样将Sqlserver数据库转成mysql数据库

手上有一个网站之前是用asp.net做的,所使用的数据库是sqlserver,现在打算用PHP+MYSQL架构.因原来的站点有一定排名,直接改版的话,会导致产生很多错误页,网站排名和收录结果要恢复过来就得很久了,且原网站里数据较多,手工转也不现实. 所以现在需要一个将MSSQL转为MYSQL的转移方案,在网上找了很多,要么很复杂,要么根本就不能用(选了几种简单的方法尝试),现在自己测试用下面的方法最简单有效. 本地环境,安装SQLserver 安装MYSQL: 1.MYSQL的工具使用navic