10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 本手册下载 从本手册中摘录

MySQL 8.0参考手册/功能和运营商/表达式求值中的类型转换

12.3表达式评估中的转换

当运算符与不同类型的操作数一起使用时,键入转换以使操作数兼容。一些转换隐含地发生。例如,MySQL根据需要自动将字符串转换为数字,反之亦然。

mysql>选择1 +'1';- > 2 mysql>选择concat(2,'测试');- >'2测试'

属性显式地将数字转换为字符串也是可能的把()函数。类隐式地进行转换concat()函数,因为它需要字符串参数。

mysql> SELECT 38.8, CAST(38.8 AS CHAR);mysql> SELECT 38.8, CONCAT(38.8);- > 38.8, 38.8

有关隐式编号到字符串转换的字符集,以及适用于的修改规则,请参阅本节稍后请参阅本节创建表......选择陈述。

以下规则描述了比较操作的转换过程:

  • 如果一个或两个参数是空值,比较结果是空值,除了空值-安全的<=>平等比较运算符。为空< = > NULL,结果是真的。不需要转换。

  • 如果比较操作中的两个参数是字符串,则它们与字符串进行比较。

  • 如果两个参数都是整数,则将它们作为整数进行比较。

  • 如果与数字相比,十六进制值被视为二进制字符串。

  • 如果其中一个参数是时间戳或者约会时间列,而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了使odbc更加友好。这不是为参数做的在().要安全,在执行比较时始终使用完整的日期,日期或时间字符串。例如,在使用时达到最佳效果之间的使用日期或时间值,使用把()显式将值转换为所需的数据类型。

    表或表中的单行子查询不被视为常数。例如,如果子查询返回与A相比的整数约会时间值,比较作为两个整数完成。整数未转换为时间值。比较操作数约会时间值,使用把()明确地将子查询值转换为约会时间

  • 如果其中一个参数是十进制值,则比较取决于其他参数。如果其他参数是十进制或整数值,则将参数与十进制值进行比较,或者如果其他参数是浮点值,则作为浮点值。

  • 在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,字符串和数字操作数的比较发生在浮点数的比较中。

有关从一个时间类型转换为另一个时间类型的值的信息,请参阅第11.2.7节,“日期和时间类型之间的转换”

JSON值的比较分为两个级别。第一级比较基于比较值的JSON类型。如果类型不同,则仅由哪个类型优先级更高来决定比较结果。如果两个值具有相同的JSON类型,则使用特定类型的规则进行第二级比较。为了比较JSON和非JSON值,将非JSON值转换为JSON,并将值作为JSON值进行比较。有关详细信息,请参见JSON值的比较和排序

下面的例子演示了将字符串转换为数字进行比较操作:

mysql>选择1>'6x';- > 0 mysql>选择7>'6x';- > 1 mysql>选择0>'x6';- > 0 mysql>选择0 ='x6';- > 1

有关具有数字的字符串列的比较,MySQL无法在列上使用索引来快速查找值。如果str_col.是一个索引的字符串列,在以下语句中执行查找时无法使用索引:

选择* from.tbl_name.在哪里str_col.= 1;

原因是有许多不同的字符串可以转换为值1,如' 1 ''1',或“1”

的浮点数和大值之间的比较整数类型是近似的,因为在比较之前,整数被转换为双精度浮点,这不能精确地表示所有64位整数。例如,整数值253+ 1不作为浮动表示,并舍入到253或253在浮点数比较前加2,这取决于平台。

为了说明,只有下面的比较中的第一个比较会比较相等的值,但两个比较返回true(1):

mysql>选择'9223372036854775807'= 9223372036854775807;- > 1 mysql>选择'9223372036854775807'= 9223372036854775806;- > 1

当发生从字符串到浮点数和从整数到浮点数的转换时,它们不一定以相同的方式发生。整数可以由CPU转换为浮点数,而字符串则是在涉及浮点乘法的运算中逐位转换。此外,结果还可能受到计算机架构、编译器版本或优化级别等因素的影响。避免这类问题的一种方法是使用把()因此,一个值不会隐式地转换为浮点数:

MySQL> Select Cast('9223372036854775807'unsigned)= 9223372036854775806;- > 0.

有关浮点比较的更多信息,请参阅第b.3.4.8节“浮点值的问题”

服务器包括时差,一个转换库,为字符串之间改进的转换提供了基础十进制值和近似值(漂浮/双倍的)数字:

  • 跨平台的一致转换结果消除了例如UNIX与窗口转换差异。

  • 在之前的结果不能提供足够精度的情况下,如接近IEEE极限的值的准确表示。

  • 将数字转换为字符串格式,具有最佳精度。精确度时差总是与标准C库功能相同或更好。

因为这个图书馆产生的转换在某些情况下不同时差结果,潜在存在于依赖于先前结果的应用中的不兼容性。例如,依赖于先前转换的特定精确结果的应用可能需要调整以适应额外的精度。

时差库提供以下属性的转换。D表示一个值十进制或字符串表示,和F表示原生二进制(IEEE)格式的浮点数。

  • F- >D转换以最佳精度,返回完成D作为生成的最短字符串F当读回并以IEEE指定的原生二进制格式读入并舍入到最接近的值。

  • D- >F转换完成了F是输入十进制字符串的最近的本机二进制编号D

这些性质意味着F- >D- >F差分是无损的,除非F+ INF,或.不支持后一种值,因为SQL标准将它们定义为无效值漂浮或者双倍的

D- >F- >D转换,无损的一个充分条件是D使用15位或更少的精度,不是一个非法线值,+ INF,或.在某些情况下,转换是无损的,即使D有超过15位的精度,但情况并非总是如此。

将数值或时间值隐式转换为字符串将生成一个值,该值具有由character_set_connectioncollation_connection系统变量。(通常设置这些变量设置名称.有关连接字符集的信息,请参阅第10.4节“连接字符集和校集”.)

这意味着这样的转换会产生一个字符(非二进制)字符串(acharVARCHAR,或longtext.值),除非在将连接字符集设置为的情况下二进制.在这种情况下,转换结果是一个二进制字符串(a二进制VARBINARY,或Longblob.价值)。

对于整数表达式,关于表达的前面的备注评价对于表达方式适用一些不同的方式任务;例如,在诸如此类的陈述中:

创建表integer_expr

在这种情况下,由表达式产生的列中的表具有类型或者长整型数字取决于整数表达式的长度。如果表达式的最大长度不适合长整型数字代替使用。长度取自max_length价值选择结果集元数据(见C API基本数据结构)。这意味着你可以强迫一个长整型数字而不是通过使用一个足够长的表达式:

CREATE TABLE t SELECT 000000000000000000000;