用了这么多年mysql数据库,才发现varchar是可以截断的,而且是在我们线上数据库。个人觉得dba的这个设置是非常有问题的,用户往数据库里存东西,就是为了以后用的,截断了存放,数据不完整,就用不了了。
        看来以后用mysql数据库,还是要先测试下varchar的行为,做到心中有数。
        varchar截断,跟sql_mode的设置息息相关,我先来两个测试,一个是我们业务上使用的数据库,另一个是我手头linux上我安装的数据库。

1. 测试两把

  1. 业务上使用的数据库
    先看sql_mode
    在这里插入图片描述

    看看sql版本
    在这里插入图片描述

  2. 我手头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"
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐