最近,公司有个系统,需要更换数据库,操纵系统,不知道为什么要转换,也许是从商业软件转换为免费的开源软件吧,现在都比较流行开源软件。数据库是由SQL Server更换为MySQL,操作系统由Windows Server 2003更换为linux服务器,这种转换并不简单,属于典型的异构平台系统转换,涉及到的主要问题有两个方面:
一个方面是数据库方面的转换,主要包括数据库结构的转换和数据的迁移。
n 数据库结构的转换,看似比较简单,只要是通用的标准SQL就可以,而实际上,从SQL Server的数据库导出的SQL根本不是标准SQL(能在各种主流数据库执行的SQL),这种SQL基本上是跟SQL Server数据库相关的SQL,所以无法直接在MySQL中执行。因此,必须手动修改SQL,将其修改为符合MySQL语法的SQL.如果原来的系统中有存储过程或数据库函数,则可能更麻烦,因为存储过程和数据库函数的语法与特定的数据库系统相关性更强,因此修改的更多。而且,用过MySQL的朋友都知道,免费的数据库,功能上确实稍微不足,比如存储过程支持的功能的自然没有SQL SERVER ,ORACLE等强大,所以,存储过程的转换自然比较麻烦。
在转换的过程中,发现了不少MySQL和SQL SERVER之间的区别,再次分享给大家:
² MySQL中连接字符串不可以用+直接连接,必须用concat函数连接,而SQL SERVER则可以。
² MySQL中没有nvarchar类型,而SQL SERVER有。但MySQL有varchar类型具有同样的功能。
² MySQL中的自动增长列用auto_increment关键字实现,而SQL SERVER则用identity函数实现。
² MySQL中没有getdate函数,而SQL SERVER有。但MySQL有curdate函数实现同样的功能。
² MySQL在建表时,不支持在default语句中使用函数,但SQL SERVER支持。
² MySQL procedure的参数名称不能加@,而SQL SERVER可以加。
² MySQL procedure的参数不能指定默认值。
² MySQL procedure声明变量时不必要加@在变量前,而SQL SERVER则是必须加@。
² SQL SERVER声明存储过程可以不加括号,即使是多个参数也可以不加括号。
² MySQL procedure声明时必须加as,而SQL SERVER必须加as.
² 如果MySQL procedure中包含多条语句,则需要begin-end关键字。
² MySQL procedure的每条语句都需要加分号。
² 不能在MySQL procedure中使用return关键字,在函数中则可以使用。
其实这两个数据库之间还有很多区别,再次不再一一列举。希望我的总结可以给大家带来帮助。
n 数据迁移。这个主要是指数据的转换,运行了几年的系统,突然要转换数据库,自然设计到数据迁移,不可能让用户的数据全部丢失吧。但是如何转换呢,同样的数据库系统自然比较简单,比如从SQL Server到SQL Server,可以通过备份-还原机制实现,MYSQL到MYSQL可以直接导出带数据的SQL脚本实现,都比较简单。现在是异构数据库,异构环境的数据迁移,确实比较麻烦,曾经做过ETL系统,了解通过ETL完全可以实现我们的这个要求,但ETL是大型的商业软件,一般免费的比较少。在网上找了下,也没有找到合适的工具,所以打算自己写程序实现了。
另一个方面是应用程序的转换,理论说,这里转换的应该不多,如果需要修改的太多,只能说明我们设计系统的时候,系统架构设计上不具备良好的可移植性。但是,这并不代表架构设计得不好,因为有时我们为了高性能,需要牺牲一些其他方面的非功能特性。
一般来说,应用程序需要修改的地方除了数据库连接配置外基本上没有了,除非在你的系统里调用了存储过程,而程序设计又跟存储过程紧耦合。