【问题标题】:How to allow empty string for integer in MySQL?如何在 MySQL 中允许整数为空字符串?
【发布时间】:2015-04-20 19:17:51
【问题描述】:

我在表中有整数字段。 POST 由复杂的 JavaScript 发送。他们发送像 "" 这样的空字符串,但正如您猜到的那样,MySQL 不允许在整数字段中使用空字符串。有没有允许空字符串的选项?就像它需要一个空字符串一样,它会将其保存为 NULL。

【问题讨论】:

  • 你的后端是什么语言的? PHP? Python?等等?
  • 在大多数脚本语言中,POST 数据是一个字符串。您必须使用语言的内置转换函数来执行转换。
  • @AndrewDunai,它是 PHP 和 Apache。最新版本。
  • 所以你想在一个整数类型的字段中存储一个空字符串?
  • 您需要明确设置NULL。请看我的回答。

标签: mysql


【解决方案1】:

有两种方法可以做到这一点。

  1. 对于当前 Mysql 会话(临时解决方案)

首先执行查询以获取您的 mysql 服务器的当前 SQL 模式。

    mysql> SELECT @@sql_mode;
    +----------------------------------------------------------------+
    | @@sql_mode                                                     |
    +----------------------------------------------------------------+
    |STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION  |
    +----------------------------------------------------------------+
    1 row in set (0.00 sec)

如果结果包含STRICT_TRANS_TABLES,则必须删除该值以允许插入查询传递 NULL 值。确保您的 mysql 用户有权应用此更改并在应用此更改后重新启动 MySQL 服务器。

    SET GLOBAL sql_mode = '';
  1. Mysql 的生命周期(永久解决方案)

您必须更新 my.cnf 文件。该文件的位置是:\etc\my.cnf 或 \etc\mysql\mysql.cnf

[mysqld]下会有一些默认参数设置,比如

[mysqld]
innodb_file_per_table=1
default-storage-engine=MyISAM
performance-schema=0
max_allowed_packet=268435456
open_files_limit=10000

只需在其下添加一行

sql-mode=""

请务必在更改此文件后重新启动 Mysql Server。通常 root 用户将是文件的所有者,因此您必须在服务器上使用 root 用户登录。

详细了解此 SQL 模式的作用。

STRICT_TRANS_TABLES

为事务性存储引擎启用严格的 SQL 模式,并在可能的情况下为非事务性存储引擎启用。有关详细信息,请参阅严格 SQL 模式。

参考:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables

NO_AUTO_CREATE_USER

防止 GRANT 语句自动创建新的用户帐户,否则会这样做,除非指定了身份验证信息。该语句必须使用 IDENTIFIED BY 指定非空密码或使用 IDENTIFIED WITH 指定身份验证插件。

参考:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_auto_create_user

NO_ENGINE_SUBSTITUTION

当 CREATE TABLE 或 ALTER TABLE 等语句指定了禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。

参考:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_engine_substitution

【讨论】:

  • 我必须使用 sql-mode="" 就像 TomCat 在 cmets 中所说的那样,否则仍然会出现错误mysqlimport: Error: 1366, Incorrect integer value: '' for column(并且文档说 TRADITIONAL 相当于 STRICT_TRANS_TABLES)。顺便说一句,路径是/etc/mysql/my.cnf。谢谢你说该行应该在[mysqld]下面,我们很容易忘记。
【解决方案2】:

从 my.ini 中删除 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 已解决问题。

编辑:删除上面的行是可行的,但这是一个坏主意。它允许拥有诸如 0000-00-00 或空字符串日期之类的东西。最好保留上面的行,不要将空字符串插入整数字段,而是将空字符串转换为 NULL,然后将该 NULL 插入整数字段。

【讨论】:

  • 我必须在 wamp 环境中的 my.ini 中明确清除 SQL 模式才能使其正常工作。要显式清除 SQL 模式,请使用 sql-mode="" 将其设置为空字符串
  • @TomCat 谢谢,my.cnf 中 [mysqld] 下面的 sql-mode=""(在 Linux 上)解决了我在导入 Geonames 数据时遇到的错误消息。
【解决方案3】:

假设该列允许 NULL 值,您必须明确告诉 MySQL 使用 NULL 的值,而不是传递一个空字符串(转换为 0):

INSERT INTO table (column_name) VALUES (NULL);

【讨论】:

  • (与否决票无关)。 . .我猜 OP 使用的是insert 而不是update,但类似的逻辑也适用。
  • 谢谢@GordonLinoff 你可能是对的。我已经修改了答案以更好地适应 OP 的具体情况(使用INSERT)。
  • @BenM,JavaScript 发布“”(或 PHP 获取“”),因此 Zend DB 尝试INSERT INTO table (column_name) VALUES ("")
  • 我会说您并不总是在查询级别拥有控制权。我正在使用当前出现此错误的库。
猜你喜欢
  • 2015-10-04
  • 2014-06-21
  • 1970-01-01
  • 2015-08-11
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多