MySQL 启用严格模式时进行的验证


<!–

–>

MySQL 启用严格模式时进行的验证

MySQL是当今最流行的关系型数据库管理系统之一。在MySQL中,严格模式提供了更加严格的字段值验证,可以帮助您避免一些常见的数据格式问题。 在本文中,我们将介绍MySQL在启用严格模式时进行哪些验证,并给出一些示例。

阅读更多:

什么是MySQL的严格模式

MySQL的严格模式是一组启用更加严格验证的设置。启用严格模式后,MySQL将抛出异常并拒绝存储或修改不符合列定义的无效数据,这有助于提高数据的完整性和一致性。以下是启用MySQL严格模式后会进行的验证。

(adsbygoogle = window.adsbygoogle || []).push({});

自动转换

在MySQL中,通常会自动将一些类型的值转换为所需类型。但是在严格模式下,不会发生自动转换,而且如果数据类型不匹配,则会抛出异常。例如,如果尝试将字符串存储到整数列中,则会引发以下错误:

ERROR 1366 (HY000): Incorrect integer value: 'foo' for column 'my_col' at row 1

在这种情况下,需要使用值分别解析在MySQL中转换为整数。以下是一些示例:

SELECT CAST('123' AS CHAR);         -- 显示 "123"
SELECT CAST('foo' AS UNSIGNED);     -- 抛出 "ERROR 1690 (22003): BIGINT UNSIGNED 
                                     -- value is out of range in `test`.`table1` 
                                     -- at row 1"
SELECT CAST('foo' AS UNSIGNED)UNSIGNED; -- 显示 "0"

检查插入的值是否为空

严格模式还会检查是否为空,即插入的值是否为空。如果未接收到值,则会引发以下错误:

ERROR 1048 (23000): Column 'my_col' cannot be null

在这种情况下,必须插入一个非空值,或者使用默认值。

插入TIMESTAMP数据

严格模式还会验证插入的时间日期格式是否有效。例如,尝试将“2009-02-31”存储在TIMESTAMP列中将导致以下错误:

ERROR 1292 (22007): Incorrect datetime value: '2009-02-31' for column 'my_col' at row 1

在这种情况下,必须使用有效的时间日期格式或转换为相应的格式。

(adsbygoogle = window.adsbygoogle || []).push({});

限制BLOB和TEXT列的大小

当使用BLOB和TEXT列时,严格模式会确保所插入和修改的数据量大小不超过列的最大字符数。例如:

CREATE TABLE mytable (
    textcol TEXT,
    blobcol BLOB
) ENGINE=InnoDB;

INSERT INTO mytable VALUES(REPEAT('a', 65535), REPEAT('b', 65535));
-- OK

INSERT INTO mytable VALUES(REPEAT('a', 65536), REPEAT('b', 65536));
-- 抛出 "ERROR 1406 (22001): Data Too Long for column 'blobcol' at row 1"

在这种情况下,需要缩小所插入或修改的内容的大小。

整数溢出

在MySQL中,整数默认使用BIGINT,但是在严格模式下,整数类型的存储也要开启严格模式。此时,如果整数值太大而无法存储,则会抛出以下错误:

ERROR 1264 (22003): Out of range value for column 'my_col' at row 1

在这种情况下,需要使用更大的数据类型来存储整数。

总结

MySQL的严格模式是一种帮助保持数据一致性和完整性的方法。当启用严格模式时,将进行严格的值验证,包括自动转换、是否为空、时间日期格式、BLOB和TEXT列大小、整数溢出等。在开发和维护MySQL数据库时,应该考虑启用严格模式,以确保数据的一致性和完整性。