网站策划的重要性,网站自定义301,返利网站建设哪个公司好,做视频的网站有哪些现象#xff1a;
我在两个mysql库都有相同定义的表#xff0c;其中一个字段是varchar(1200)。当我都对这个表进行insert操作#xff0c;而且超过此字段的规定长度#xff08;此处是1200#xff09;#xff0c;这两库的行为是不一样的#xff1a;库B是直接报错too long
我在两个mysql库都有相同定义的表其中一个字段是varchar(1200)。当我都对这个表进行insert操作而且超过此字段的规定长度此处是1200这两库的行为是不一样的库B是直接报错too long库A却不报错只是在程序后台观察到返回了warning。这是为什么?
文心的解释
在MySQL中对于超出定义长度的VARCHAR字段进行插入操作时行为可能会因为不同的SQL模式SQL Modes而有所不同。SQL模式定义了MySQL应该支持的SQL语法、数据验证以及如何处理错误等情况。
SQL模式差异
严格模式STRICT_TRANS_TABLES当启用严格模式时如果尝试插入的数据超出了字段定义的范围MySQL会报错并拒绝执行该操作。 非严格模式在不启用严格模式时MySQL可能会接受超长的数据但会截断数据到允许的最大长度并生成一个警告warning而不是错误。
两个数据库可能配置了不同的SQL模式。一个数据库可能启用了严格模式而另一个没有。
检查SQL模式
要查看当前会话的SQL模式可以使用以下SQL命令SELECT sql_mode; 要查看全局SQL模式可以使用SELECT GLOBAL.sql_mode;
实践验证
库A SELECT sql_mode;返回 STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION。而SELECT GLOBAL.sql_mode;返回NO_ENGINE_SUBSTITUTION。
库B SELECT sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。 SELECT GLOBAL.sql_mode;返回ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
可以看到库A的全局级别SQL模式没有严格模式STRICT_TRANS_TABLES而库B有。这可能就是原因。