10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 本手册下载 本手册节选

MySQL 5.7参考手册/函数和运算符/表达式求值中的类型转换

12.3表达式求值中的类型转换

当操作符与不同类型的操作数一起使用时,将进行类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。

mysql >选择1 + 1;SELECT CONCAT(2,' test');——>“2测试”

方法还可以显式地将数字转换为字符串把()函数。函数隐式地进行转换CONCAT ()函数,因为它期望字符串参数。

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

有关隐式数字到字符串转换的字符集的信息,以及应用于的修改规则,请参阅本节后面的内容创建表……选择语句。

以下规则描述了比较操作如何进行转换:

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

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

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

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

  • 如果其中一个参数是a时间戳DATETIME列和另一个参数是一个常量,该常量在执行比较之前被转换为时间戳。这样做是为了对odbc更加友好。这不是为参数做的在().为了安全起见,在进行比较时,总是使用完整的datetime、date或time字符串。例如,在使用时要达到最好的效果之间的与日期或时间值一起使用把()显式地将值转换为所需的数据类型。

    来自一个或多个表的单行子查询不被视为常量。例如,如果子查询返回要与a比较的整数DATETIME值时,比较作为两个整数进行。该整数没有转换为时态值。将操作数比较为DATETIME值,使用把()来显式地将子查询值转换为DATETIME

  • 如果其中一个参数是十进制值,则比较取决于另一个参数。如果另一个参数是小数或整数值,则将参数比较为十进制值;如果另一个参数是浮点值,则将参数比较为浮点值。

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

有关值从一种时态类型转换为另一种时态类型的信息,请参见第11.2.8节“日期和时间类型之间的转换”

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

下面的例子演示了比较操作中字符串到数字的转换:

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

对于字符串列与数字的比较,MySQL不能使用列上的索引来快速查找值。如果str_col是一个索引字符串列,在以下语句中执行查找时不能使用索引:

SELECT * FROMtbl_name在哪里str_col= 1;

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

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

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

mysql> SELECT '9223372036854775807' = 9223372036854775807;-> 1 mysql> SELECT '9223372036854775807' = 9223372036854775806;- > 1

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

> SELECT CAST('9223372036854775807' AS UNSIGNED) = 9223372036854775806;- > 0

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

服务器包括时差是一种转换库,为改进字符串或小数Values和approximate-value (浮动/)数量:

  • 跨平台的一致转换结果,消除了例如Unix和Windows转换的差异。

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

  • 以最佳精度将数字转换为字符串格式。的精度时差总是与标准C库函数相同或更好。

因为这个库产生的转换在某些情况下不同于非-时差结果,依赖于以前结果的应用程序可能存在不兼容性。例如,依赖于来自以前转换的特定精确结果的应用程序可能需要调整以适应额外的精度。

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

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

  • D->F转换是这样进行的F是否最接近输入十进制字符串的本机二进制数D

这些性质意味着F->D->F转换是无损的除非F+正,或.后面的值不受支持,因为SQL标准将它们定义为无效值浮动

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

将数值或时间值隐式转换为字符串将生成具有字符集和排序规则的值character_set_connection而且collation_connection系统变量。(这些变量通常设置为组名称.有关连接字符集的信息,请参见第10.4节“连接字符集和排序规则”.)

这意味着这样的转换结果是一个字符(非二进制)字符串(a字符VARCHAR,或量变值),除非连接字符集被设置为二进制.在这种情况下,转换结果是一个二进制字符串(a二进制VARBINARY,或LONGBLOB值)。

对于整数表达式,前面关于表达式的说明评价表达方式略有不同赋值;例如,在这样的语句中:

CREATE TABLE t SELECTinteger_expr

在本例中,由表达式生成的列中的表具有类型INT长整型数字取决于整数表达式的长度。如果表达式的最大长度不适合INT长整型数字而不是使用。长度是从max_length的价值选择结果集元数据(参见C API基本数据结构).这意味着您可以强制a长整型数字而不是INT用足够长的表达式:

CREATE TABLE t SELECT