当表达式中的运算符与不同类型的操作数一起使用时,会发生数据类型转换以使操作数兼容。
转换方式
OceanBase 数据库支持显式数据类型转换和隐式数据类型转换。
隐式数据类型转换发生在这样的场景中:一个操作需要一个指定数据类型的参数,但语句的实际参数值并不是指定数据类型,这时 OceanBase 数据库会将实际参数值转为指定数据类型后,再进行后续操作。
如下例所示,OceanBase 数据库会根据需要自动将字符串转换为数字,反之亦然。
obclient> SELECT 1+'1';
+-------+
| 1+'1' |
+-------+
| 2 |
+-------+
1 row in set
OceanBase 数据库的显示数据类型转换通过 CAST 函数实现。如下例所示:
obclient> SELECT 31.4, CAST(31.4 AS TIME);
+------+--------------------+
| 31.4 | CAST(31.4 AS TIME) |
+------+--------------------+
| 31.4 | 00:00:31 |
+------+--------------------+
1 row in set
有关 CAST 函数的相关信息,请参见 CAST。
转换规则
比较运算的转换规则
如果一个或两个参数为
NULL,则比较结果为NULL,但<=>比较运算符除外。对于NULL <=> NULL,结果为真,不需要转换。如果比较运算中的两个参数都是字符串,则将它们作为字符串进行比较。
如果两个参数都是整数,则将它们作为整数进行比较。
如果不与数字进行比较,十六进制值将被视为二进制字符串。
来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回的整数要与
DATETIME值进行比较,则将两个操作数作为整数进行。由于整数不会被转换为时间值,所以要将操作数作为DATETIME值进行比较,请使用CAST()将子查询值显式转换为DATETIME。如果其中一个参数是
TIMESTAMP或DATETIME列,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。为安全起见,在进行比较时始终使用完整的日期时间、日期或时间字符串。例如,在BETWEEN与日期或时间值一起使用时,要想获得最佳结果,请使用CAST()将值显式转换为所需的数据类型。如果其中一个参数是十进制值,则比较类型取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较,如果另一个参数是浮点值,则作为浮点值进行比较。
除上述以外的情况,参数将作为浮点(实数)数进行比较。例如,字符串和数字操作数的比较是作为浮点数的比较进行的。
浮点数和
INTEGER类型的大值之间的比较是近似的,因为整数在比较之前被转换为双精度浮点数,无法准确表示所有 64 位整数。
其他相关转换规则
从字符串到浮点数和从整数到浮点数的转换方式不一定相同。结果可能会受到编译器版本等因素的影响。避免此类问题的一种方法是使用
CAST()以防止该值不会隐式转换为浮点数。将数值或时间值隐式转换为字符串会产生一个值,该值具有由
character_set_connection和collation_connection系统变量确定的字符集和字符序。这意味着此类转换会生成非二进制字符串(
CHAR、VARCHAR或LONGTEXT值),如果将连接字符集设置为二进制,则转换结果是二进制字符串(BINARY、VARBINARY或LONGBLOB值)。对于整数表达式求值时的类型转换有些不同。例如,表达式生成的列中的表具有
INT或BIGINT类型, 如下所示:CREATE TABLE t SELECT integer_expr;如果表达式的最大长度不适合
INT,则使用BIGINT。但可以通过使用足够长的表达式来强制使用BIGINT而不是INT:obclient> CREATE TABLE t SELECT 000000000000000000000; Query OK, 1 row affected




