转自:http://www.searchdatabase.com.cn/showcontent_71763.htm
【TechTarget中国原创】本文旨在帮助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也可以考虑自己手动转换。
|