【问题标题】:why integer data gets inserted into 'varchar' column without giving the single quotes?为什么整数数据被插入到“varchar”列而不给出单引号?
【发布时间】:2017-11-30 23:22:42
【问题描述】:
create table student(id int, name varchar(20));

在此处创建学生表。*

insert into student values(20,100);

在上面的查询中,我在 name 列中插入整数值 100,即 varchar。为什么它没有给出错误或它是如何被插入的?

edit 1:但是在插入字符串时需要单引号吗? 前任。 插入学生价值观(20,suraj); 给出错误

【问题讨论】:

标签: mysql implicit-conversion


【解决方案1】:

这对不同的数据库有不同的处理方式。对于 MySQL,整数会为您隐式转换为 varchar,但在 SQL 中,它会产生错误。对于 MySQL,自动转换只是一些语言为了方便而提供的松散类型的一部分。

如果你想强制 MySQL 进行类型检查,你可以在你的配置文件中使用 STRICT_ALL_TABLES。您还可以通过以下方式在当前会话中设置它:

$ SET sql_mode = 'STRICT_ALL_TABLES';

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_all_tables

希望这会有所帮助!

edit 1:对于字符串文字,语言通常需要引号,以便程序知道它是字符串而不是关键字。例如,如果你的字符串是“select”,MySQL 需要知道你的意思是一个字符串。

【讨论】:

  • 现在我理解了隐式转换。但是,他们为什么要提供这种隐式转换呢?我的意思是,这可能会损害数据完整性。
  • 在完整性受到损害的情况下,您有什么例子?如果您取 10 或 '10',则两者在数据库中最终都为 '10'。如果您取“一”并尝试将其存储在数字列中,则会产生错误。如果您将“2017-01-01”与日期进行比较,则比较有效;只要支持日期格式。
  • 我认为根据 MySQL 的数据库设计,这只是一件方便的事情。 PHP、javascript 和 bash 的类型也很松散。
  • 可能是因为这是 ANSI SQL 标准中定义字符串的方式;但我现在正在寻找那个。还不能轻易找到它...考虑一下,如果您的字符串是“她问,“你好吗?”没有单引号来抵消逗号和引号,数据库可能会认为您正在尝试插入“她问”在一栏中,“你好吗?”在另一个......所以'只是表示结构。但我还不能找到来源。换句话说,因为这是编译器知道如何解释字符数据的方式。
  • 在大多数 SQL 引擎中," 表示字段或表名的开头和结尾;尤其是那些使用空格或其他特殊字符的。它们在某些引擎中也可以用来表示字符串数据;但我建议坚持' 用于字符数据和" 用于表/字段名称。(如果需要)虽然mySQL 使用反引号......叹息
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 2016-05-31
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 2012-01-01
  • 2021-03-17
相关资源
最近更新 更多