MySQL基本语法和SQL Server语法的差异小归纳(6)

对于SET类型,和enum类似,不区分大小写,存储时删除尾随空格,null也是有效值。但不同的是可以组合多个给出的值。如set('a','b','c','d')可以存储'a,b','d,b'等,多个成员之间使用逗号隔开。所以,使用多个成员的时候,成员本身的值中不能出现逗号。并且存储数据时忽略重复成员并按照枚举时的顺序存储,如set('d','b','a'),存储'a,b,a','b,a,b'的结果都是'b,a'。使用find_in_set(set_value,set_column_name)可以检索出包含指定set值set_value的行。

SELECT * FROM test6 WHERE FIND_IN_SET('d',col)>0; 3. 数据类型属性 3.1 unsigned

unsigned属性就是让数值类型的数据变得无符号化。使用unsigned属性将会改变数值数据类型的范围,例如tinyint类型带符号的范围是-128到127,而使用unsigned时范围将变成0到255。同时unsigned也会限制该列不能插入负数值。

create table t(a int unsigned,b int unsigned); insert into t select 1,2; insert into t select -1,-2;

上面的语句中,在执行第二条语句准备插入负数时将会报错,提示超出范围。

使用unsigned在某些情况下确有其作用,例如一般的ID主键列不会允许使用负数,它相当于实现了一个check约束。

但是使用unsigned有时候也会出现些不可预料的问题:在进行数值运算时如果得到负数将会报错。例如上面的表t中,字段a和b都是无符号的列,且有一行"a=1,b=2"。

mysql> select * from t; +---+---+ | a | b | +---+---+ | 1 | 2 | +---+---+ 1 row in set

此时如果计算"a-b"将会出错,不仅如此,只要是unsigned列参与计算并将得到负数都会出错。

mysql> select a-b from t; 1690 - BIGINT UNSIGNED value is out of range in '(`test`.`t`.`a` - `test`.`t`.`b`)' mysql> select a-2 from t; 1690 - BIGINT UNSIGNED value is out of range in '(`test`.`t`.`a` - 2)'

而不是负数的结果将不会有影响。

mysql> select 2-a,a*3 from t; +-----+-----+ | 2-a | a*3 | +-----+-----+ | 1 | 3 | +-----+-----+ 1 row in set

这并不是MySQL中的bug,在C语言中的unsigned也一样有类似的问题。这个问题在MySQL中设置set sql_mode='no_unsigned_subtraction'即可解决。

3.2 zerofill

zerofill修饰字段后,不足字段显示部分将使用0来代替空格填充,启用zerofill后将自动设置unsigned。zerofill一般只在设置了列的显示宽度后一起使用。关于列的显示宽度在上文已经介绍过了。

mysql> create table t1(id int(4) zerofill); mysql> select * from t1; +-------+ | id | +-------+ | 0001 | | 0002 | | 0011 | | 83838 | +-------+ 4 rows in set (0.00 sec)

zerofill只是修饰显示结果,不会改变存储的数据值。

4. 操作符

只说明些SQL Server中没有的运算符。详细内容见官方手册:函数和操作符

4.1 安全等于运算符(<=>)

这个符号和"="进行相同的运算,但是它多出的一个功能是可以和NULL进行比较。

当比较的两边都是NULL时返回1而不是NULL,只有一边是null时返回0而不是null,其余的时候和"="的结果一样。

mysql> SELECT 1<=>NULL UNION ALL SELECT NULL<=>NULL UNION ALL SELECT 1=0 UNION ALL SELECT 1<=>0; +----------+ | 1<=>NULL | +----------+ | 0 | | 1 | | 0 | | 0 | +----------+ 4 rows in set 4.2 正则表达式运算符(regexp或者rlike)

在SQL Server中没有正则表达式运算符,而MySQL中有。格式:expression regexp reg_pattern

若expression满足reg_pattern,则返回1,无法匹配成功则返回0。若expression或reg_pattern任意一方为null,则返回null。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/927ba476bd2b2a083daad0730bac5769.html