暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

OceanBase SQL语句表达式求值的类型转换

2024-04-16
896

当表达式中的运算符与不同类型的操作数一起使用时,会发生数据类型转换以使操作数兼容。

转换方式

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 系统变量确定的字符集和字符序。

    这意味着此类转换会生成非二进制字符串(CHARVARCHAR 或 LONGTEXT 值),如果将连接字符集设置为二进制,则转换结果是二进制字符串(BINARYVARBINARY 或 LONGBLOB 值)。

  • 对于整数表达式求值时的类型转换有些不同。例如,表达式生成的列中的表具有 INT 或 BIGINT 类型, 如下所示:

    CREATE TABLE t SELECT integer_expr;
    

    如果表达式的最大长度不适合 INT,则使用 BIGINT。但可以通过使用足够长的表达式来强制使用 BIGINT 而不是 INT

    obclient> CREATE TABLE t SELECT 000000000000000000000;
    Query OK, 1 row affected
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论