本文旨在帮助DBA评估MS SQL Server和MySQL数据库之间进行移植的挑战,主要对两种数据库的函数进行了对比,以及为了让实现无缝的迁移,你需要做哪些工作。
函数类别
函数可以分为三个不同的类别:
1. 相同函数:可以安全地从一个数据库移植到另一个数据库,无需做任何修改。
2. 相似函数:此类函数只在一个数据库中有用,移植需要做一些转换工作。
3. 不支持的函数:由于逻辑/物理组织和安全模型的差异,这些函数不能很方便地移植。
相同函数
以下函数在MySQL和SQL Server的查询中不做任何修改即可使用:
ASCII, LEFT, LOWER, LTRIM, REPLACE, REVERSE, RIGHT, RTRIM, SOUNDEX, SPACE, SUBSTRING, UPPER, ABS, ACOS, ASIN, ATAN, ATAN2, CEILING, COS, COT, DEGREES, EXP, FLOOR, LOG, LOG10, PI, POWER, RADIANS, RAND, ROUND, SIGN, SIN, SQRT, TAN, DAY, MONTH, COALESCE, NULLIF, CAST, CONVERT.
相似函数
在迁移过程中的主要工作都集中在这些函数当中:
- Transact-SQL的CASE函数:
CASE WHEN @a > @b THEN @a ELSE @b – @a END |
这可以转换为MySQL的IF(expr1, expr2, expr3) 函数。工作原理是:
如果表达式expr1是TRUE(expr1 <> 0和expr1 < > NULL),那么IF()函数返回表达式expr2;否则,返回表达式expr3。
MySQL示例:
if(@a>@b, @a, @b-@a) |
- 将二进制数据转换为Varchar
在SQL SERVER 2008中CONVERT()函数支持将二进制数据转换成十六进制字符串。用法:
CONVERT(NVARCHAR(34), 0xc23eed6b65c93e44a41a2818e274194f |
MySQL的BIN(N)函数,返回值为N的二进制值的字符串表示,可利用其来替代CONVERT函数。
- Transact-SQL的DATALENGTH函数
该函数转换较为容易,因为MySQL的BIT_LENGTH函数同样返回字符串的位长度。
- 字符串合并
SQL Server不支持ANSI SQL的CONCAT()函数。相反,它使用(+)加号运算符实现字符串合并:
’A’+’B’+’C’, ‘A’+’#’+’B’+’#’+’C’ |
在MySQL中,使用CONCAT(str1, str2, ……)或CONCAT_WS(separator, str1, str2, ……)函数返回输入参数的连接串:
CONCAT(‘A’,’B’,’C’), CONCAT_WS(‘#’,’A’,’B’,’C’) |
- 在不同进制之间转换数值
有时需要将数值转换为非十进制的字符串。在SQL Server中,这就需要使用CAST函数或编写一个自定义函数。MySQL则不需要,因为ANSI SQL的CONV(N, from_base, to_base)函数可以从一种进制转换为另一种进制。
- 返回字符串中第一个匹配子字符串的位置
Transact-SQL的CHARINDEX函数对应的ANSI SQL的LOCATE()函数。
- 在另一个字符串中插入字符串
在SQL Server中,REPLACE函数用于替换为一个字符串中的某些部分。例如,下面的示例用字符串“xyz”替换字符串“abcdefghi”中的“def”。
SELECT REPLACE(‘abcdefghicde’,’def’,’xyz’); |
MySQL的INSERT(str, pos, len, newstr)函数可以返回从位置pos开始用字符串newstr替换len个字符长的字符串str。
- 从文件中加载数据和声明
T-SQL批量加载语句、从一个文本文件中加载数据和可执行语句的扩展存储过程可以替换为MySQL中的LOAD_FILE(file_name)。
- 获取当前日期
Transact-SQL的NOW函数对应ANSI SQL的GETDATE函数。
- 生成重复的字符串
Transact-SQL的REPLICATE函数对应ANSI SQL的REPEAT函数。
- 测试NULL
Transact-SQL依赖CASE和IS NULL子句来检查NULL值。在MySQL中,可以只使用ISNULL(expr)函数进行替代。如果表达式expr为NULL,ISNULL ()函数返回1;否则将返回0。
- 比较两个字符串
Transact-SQL依赖比较运算符进行字符串比较,而ANSI SQL提供 STRCMP (expr1, expr2)函数。
- 格式化日期
Transact-SQL使用日期、字符串和转换函数的组合将日期格式化为字符串,ANSI SQL则具有专门进行日期格式化的函数DATE_FORMAT(date, format)。
- 添加给定的日期间隔
Transact-SQL的DATEADD函数在Oracle、DB2和PostgreSQL中都有类似函数。MySQL也有,即DATE_ADD:
SELECT DATE_ADD(‘2010-12-31 23:59:59’, INTERVAL 1 DAY); |
返回值为’2011-01-01 23:59:59′
- 秒数和时间的转换
在Transact-SQL中,秒数和时间之间进行转换,比如12:34:00,则需要将CONVERT和DATEADD函数结合起来使用。例如,下面的示例将时间转换为秒数:
CONVERT(char(8), DATEADD(second, Diff, ‘0:00:00’), 108) |
MySQL可以使用SEC_TO_TIME(seconds)和 TIME_TO_SEC(time)函数轻松完成秒数与时间之间的转换。
- 检索最后一个插入的ID值
Transact-SQL的@@IDENTITY和SCOPE_IDENTITY函数用于检索最后插入的ID值。MySQL提供LAST_INSERT_ID函数完成相同的功能。
- 连接列值
要将列的内容连接成一个字符串,在T-SQL中需要分成几个步骤:
declare @v varchar(max) set @v=” select @v=@v+’,’+isnull(field_a,”) from table_1 select substring(@v,2,len(@v)) |
在ANSI SQL中使用GROUP_CONCAT函数可以很容易完成。它有支持两种不同类型的格式:
- GROUP_CONCAT( Language SEPARATOR ‘-’ ) :使用短划线替代默认的逗号分隔符。
- SELECT GROUP_CONCAT( Language ORDER BY Language DESC ):用于更改排序顺序。
注意:GROUP_CONCAT函数忽略空值。
不支持的函数
任何以SQL Server为中心的函数要么删除,要么使用ANSI SQL语句组合进行重写。一旦完成,把新代码保存为用户自定义函数,以方便重复使用。
转换工具
一些自动化工具可以转换SQL Server和MySQL之间的存储过程,如Ispirer的SQLWays。它能转换存储过程、函数、包和触发器。但它不是免费的,价格不便宜,DBA也可以考虑自己手动转换。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
SAP软件配置管理器如何促进迁移成功?
使用SWPM进行迁移也被称为古典迁移方法,因为这个工具允许任何第三方数据库迁移到SAP HANA。
-
从小型机到x86:四川电信核心数据库迁移到虚拟化平台
四川电信在今年5月,成功将核心CRM系统的Oracle数据库从IBM P595小型机迁移到基于x86的私有云平台上。
-
如何从MySQL迁移到MariaDB?
本文详细给出了在 CentOS 6.4 上从 MySQL 5.5.31 迁移至 MariaDB 5.5.31 的操作记录。
-
一步完成MySQL向Redis的迁移
在把一个大表从 MySQL 迁移到 Redis 时,你可能会发现,每次提取、转换、导入一条数据是让人难以忍受的慢。