2 < 11
-> 1 下面的表达式涉及串比较,因为其两边的操作数都是串:
"2" < "11"
-> 0 在下面的比较中,类型是混合的,因此,MySQL按数比较它们。结果是两个表达式都为真:
 在各个比较中,MySQL根据下列规则对操作数进行转换: ■ 除了“< = >”运算符外,涉及NULL 值的比较其值为NULL(除NULL <=> NULL 为真外,“< = >”与“=”相同)。 ■ 如果两个操作数都是串,则按串进行字典顺序的比较。串比较利用服务器上有效的字符集进行。 ■ 如果两个操作数都为整数,则按整数进行数的比较。 ■ 不与数进行比较的十六进制常量按二进制串进行比较。 ■ 如果其中有一个操作数为TIMES TAMP 或DATETIME 值而另一个为常量,则按TIMES TAMP 值进行比较。这样做将使比较对ODBC 应用更好。 ■ 否则,两个操作数将按浮点值进行数的比较。注意,这包括一个串与一个数进行比较的情况。其中串被转换为数,如果该串转换后不是一个数,则结果为0。例如,”14 . 3”转换为14 . 3,但“L 4 . 3” 转换为0。 1. 日期与时间的解释规则 MySQL按表达式的环境将串和数自由地转换为日期和时间值,反之亦然。日期和时间值在数值上下文中转换为数;数在日期或时间上下文中转换为日期或时间。在将一个值赋予一个日期或时间列时,或在函数需要一个日期或时间值时,进行转换为日期或时间值的转换。如果表my_table 含有一个DATE 列date _ col,下列语句是等价的:
 TO _ DAYS( ) 函数的参数在下面三个表达中为相同的值:
 2. 测试并强制进行类型转换 为了了解表达式中类型转换是怎样进行的,用mysql程序发布一条对表达式求值的SELECT 语句如下:
 正如您所想像的那样,笔者在撰写本章时,做了不少这种比较。测试表达式的求值对于诸如DELETE 或UPDATE这种修改记录的语句极为重要,因为需要保证只涉及所需涉及的行。检查表达式的一个办法是,预先执行一条具有准备用于DELETE 或UPDATE语句的相同WHERE 子句,以验证该子句选择的行是正确的。假如表my_table 具有一个含有下列值的CHAR 列char _ col:
 原来的打算大概是想删除包含值“0 0” 的那两行。但实际作用是删除了所有的行。之所以这样是由于MySQL的比较规则在起作用。char_col 为一个串列,但00 没有用引号括起来,因此,它被作为数对待了。按MySQL的比较规则,涉及一个串与一个数的比较按两个数的比较来求值。随着DELETE 查询的执行,char_col 的每个值被转换为0,”0 0”也被转换为0,因此,所有不类似数的串都转换成0。从而,对于每一行, WHERE 子句都为真,因此,DELETE 语句清空了该表。显然,这是一种在执行DELETE 前,应该用SELECT 语句对WHERE 子句进行测试的情况,这样将会示出表达式所选择的行太多了。如下所示:
 如果不能肯定某个值的使用方式,可以利用MySQL的表达式求值机制将该值强制转换为特定的类型: ■ 增加+ 0 或+ 0.0 到某项上以强制转换到一个数值:

 3. 超范围值或非法值的转换 超范围值或非法值的转换的基本原则为:无用输入,无用输出。如果不在存储日期前对其进行验证,那么可能会得到不喜欢的东西。下面给出一些MySQL处理超范围值或不合适值的一般原则,这些内容曾经在前面介绍过: ■ 对于数值或T I M E列,超出合法范围的值被剪裁为相应取值范围的最接近的数值并作为结果值存储。 ■ 对于非ENUM 或SET 的串列,太长的串被截为适合该列存储的最大长度的串。ENUM 或SET 列的赋值依赖于定义列时给出的合法值。如果赋予ENUM 列一个未作为枚举成员给出的值,将会赋予一个错误成员(即,对应于零值成员的空串)。如果赋予SET 列一个包含未作为集合成员给出的子串的值,那么,那些未作为集合成员给出的子串将被删除,并将剩余成员构成的值赋给该列。 ■ 对于日期或时间列,非法值被转换为该类型适当的“零”值(参阅表2 - 11)。对于非TIME 的日期和时间列,超出取值范围的值可转换为“零”值、NULL或某种其他的值(换句话说,结果是不可预料的)。 这些转换都将作为ALTER TABLE、LOAD DATA、UPDATE和多行INSERT 语句的警告信息报告。在mysql客户机中,这些信息显示在查询报告的状态行上。在编程语言中,可通过某些其他手段取得这个信息。如果使用的是MySQLC API,那么可调用mysql_info( ) 函数来获得这个信息。对于Perl DBI API,可利用数据库连接的mysql_info 属性。所提供的这个信息是警告信息的次数计数。为了知道更改了哪些行,可发布一条SELECT ... INTOOUTFILE 查询,并将结果与原始行进行比较。
|