用了这么多年mysql数据库,才发现varchar是可以截断的,而且是在我们线上数据库。个人觉得dba的这个设置是非常有问题的,用户往数据库里存东西,就是为了以后用的,截断了存放,数据不完整,就用不了了。
看来以后用mysql数据库,还是要先测试下varchar的行为,做到心中有数。
varchar截断,跟sql_mode的设置息息相关,我先来两个测试,一个是我们业务上使用的数据库,另一个是我手头linux上我安装的数据库。
1. 测试两把
-
业务上使用的数据库
先看sql_mode
看看sql版本
-
我手头linux上的数据库
5.7.42版本
测试一把看看
2. mysql的sql_mode 及其含义
项目 | Value | Value |
---|---|---|
1 | ONLY_FULL_GROUP_BY | 这个模式要求在使用GROUP BY时,所有未聚合的列都必须在GROUP BY子句中出现。这样可以避免出现不明确的结果。 |
2 | STRICT_TRANS_TABLES | 在这个模式下,MySQL 会严格执行数据的类型和值的检查。如果插入或更新的数据与表的定义不匹配,MySQL 将抛出错误而不是警告。 |
3 | NO_ZERO_DATE | 这个模式禁止将日期值设置为 ‘0000-00-00’,如果尝试插入这样的值,MySQL 将抛出错误。 |
4 | NO_ZERO_IN_DATE | 与上一个模式类似,但它只禁止在日期值的年、月或日部分中使用零。 |
5 | ERROR_FOR_DIVISION_BY_ZERO | 在这个模式下,如果一个算术表达式中出现了除以零的情况,MySQL 将抛出错误。 |
6 | NO_AUTO_CREATE_USER | 这个模式禁止使用GRANT语句自动创建新用户。 |
7 | NO_ENGINE_SUBSTITUTION | 如果你指定了一个不存在的存储引擎,MySQL 将抛出错误而不是使用默认的存储引擎。 |
8 | PIPES_AS_CONCAT | 在这个模式下,管道符号( |
9 | ANSI_QUOTES | 启用这个模式后,你可以使用双引号来引用字符串,而不仅仅是单引号。 |
10 | IGNORE_SPACE | 这个模式允许在函数名和左括号之间有空格。 |
11 | STRICT_ALL_TABLES | 这是一个组合模式,包含了STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO和NO_AUTO_CREATE_USER等多个模式。 |
3. 设置sql_mode的方式
设置sql_mode的方式
你可以通过以下 SQL 语句设置当前会话的 SQL 模式:
SET SESSION sql_mode ='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES';
或者,你也可以在 MySQL 配置文件中设置全局的 SQL 模式。例如,在my.cnf文件中添加以下行:
[mysqld]sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES"