查询的意外行为

Posted

技术标签:

【中文标题】查询的意外行为【英文标题】:Unexpected behaviour of the query 【发布时间】:2011-07-30 19:52:12 【问题描述】:

这个特定的查询应该将用户输入到数据库中。

此查询并不总是将 firstname 和 lastname 字段的值与其他字段一起插入。对于少数插入,firstname 和 lastname 为空,而对于其他插入则按预期工作。

插入“用户”(手机、密码哈希、名字、姓氏、ent_id、电子邮件) 值('913800341127'、'678a1491514b7f1006d605e9161946b1'、'nat'、'sam'、'108'、NULL) 重复键更新 `firstname` = VALUES(firstname),`lastname` = VALUES(lastname)

相关信息:

创建表`用户`( `id` int(11) NOT NULL auto_increment, `tag` varchar(5) NOT NULL 默认 'ind', `username` varchar(50) 默认 NULL, `firstname` varchar(100) 默认为 NULL, `lastname` varchar(100) 默认为 NULL, `passwordhash` varchar(255) NOT NULL, `secretq` varchar(255) 默认 NULL, `secreta` varchar(100) 默认为 NULL, `email` varchar(50) 默认 NULL, `mobile` varchar(13) 默认为 NULL, `last_login` 日期时间默认 NULL, `ent_id` bigint(20) NOT NULL 默认为 '1', `is_inactive` tinyint(1) NOT NULL COMMENT '用户是否活跃', 主键(`id`), 唯一键`mobile_2`(`mobile`,`ent_id`), 唯一键 `email_2` (`email`,`ent_id`), KEY `用户名`(`用户名`), KEY `ent_id` (`ent_id`,`tag`) ) 引擎=InnoDB 默认字符集=latin1

【问题讨论】:

我敢打赌,当用户名包含非 ASCII 字符时会发生这种情况,这些字符以 latin1 以外的其他编码(如 UTF-8)出现并完全破坏字符串。您需要添加有关数据来源的更多信息。 你能告诉我们关于它失败的案例吗?相同的数据总是在同一个地方失败吗?它在高负载下会失败吗?日志中有任何错误或警告吗? 您能以对他人有所帮助的方式回答您自己的问题吗?如果你这样做,你可以选择你的作为正确答案。这可能看起来很奇怪,但在这种情况下最好不要删除。 【参考方案1】:

语法错误应该是:

ON DUPLICATE KEY UPDATE firstname = 'nat',lastname = 'sam'

【讨论】:

以上是关于查询的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

db2 中查询的意外行为

NHibernate:查询未映射实体时的意外行为

BigQuery:写入查询结果时使用 bigquery 作业的意外行为

Python MySQLdb 意外行为(?)

MIN() MAX() BigQuery - 意外行为

WindowsLookAndFeel关于按钮着色的意外行为