【问题标题】:Query with column named "name"查询名为“名称”的列
【发布时间】:2012-01-17 16:04:12
【问题描述】:

我正在尝试加入几个表,但我的加入语句失败了。我相信这是因为第二个连接中的列名是“名称”,也许 MySQL 认为我正在尝试访问一个属性?我该如何解决这个问题?

SELECT surgery_city.*, s.surgeon_type, st.abbrev
FROM surgery_city 
LEFT JOIN surgery_key as s ON s.surg_id = treatment_id 
LEFT JOIN states as st ON st.name = surgery_city.state
WHERE treatment_id='10001'

问题是我引用 st.name 的第二个左连接 - 关于如何正确引用该列的任何想法?不幸的是,此时更改表中的列名不是一个选项:(..

谢谢,

银虎

更新:

我在上面的查询中得到的错误是:

[Err] 1267 - 操作“=”的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

当我用反引号包围该字段时,我得到以下信息:

LEFT JOIN states as st ON `st.name` = seo_surgery_city.state

我得到以下信息:

[Err] 1054 - 'on 子句'中的未知列 'st.name'

它也失败了

LEFT JOIN states as st ON st.`name` = seo_surgery_city.state

(单引号 = 此处的反引号,但此处无法正常显示)

[Err] 1267 - 操作“=”的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

同样失败

LEFT JOIN states as st ON `st`.`name` = seo_surgery_city.state

[Err] 1267 - 操作“=”的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合

【问题讨论】:

  • 你能告诉我们它是如何失败的吗?你有错误吗?什么错误?
  • name 是关键字。用反引号将 st.name 括起来。
  • @MouseFood 你确定吗? MySQL Reserved Words
  • @MouseFood 我没看到namereference中的关键字

标签: mysql mysql-error-1267


【解决方案1】:

你应该用反引号括住列名:

st.`name`

UPD

问题是列有不同的排序规则,请尝试以下操作:

SELECT surgery_city.*, s.surgeon_type, st.abbrev
FROM surgery_city 
LEFT JOIN surgery_key as s ON s.surg_id = treatment_id 
LEFT JOIN states as st ON st.name = (surgery_city.state COLLATE utf8_unicode_ci)
WHERE treatment_id='10001'

但要解决此问题,您应该更新其中一列的排序规则:states.nameseo_surgery_city.state。他们都应该有utf8_general_ci

【讨论】:

  • 添加整理功能有效,不需要反引号..非常感谢。
  • @Silvertiger,我很高兴。但是如果可以的话,最好将st.name中的列定义更新为utf8_general_ci =)
【解决方案2】:

尝试将列名放在反引号中,例如 st.nameSee the docs.

【讨论】:

  • @Shiplu:因为OP没有包含错误信息,我只能推断出问题所在。你不能诚实地说“我知道你的问题的解决方案,即使你还没有告诉我它是什么”。
  • 建议无论如何都不正确=),只应引用列名。
【解决方案3】:

您应该对所有表和列使用相同的排序规则和字符集。如果您不知道使用什么排序规则,请使用utf8_general_ciutf8 字符集。

ALTER TABLE seo_surgery_city CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';
ALTER TABLE seo_surgery_key CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';
ALTER TABLE states CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';

【讨论】:

  • [SQL] ALTER TABLE seo_surgery_city 转换为字符集 latin1 COLLATE 'utf8_general_ci'; [Err] 1253 - COLLATION 'utf8_general_ci' 对 CHARACTER SET 'latin1' 无效
【解决方案4】:

2022 年更新:

关键字 “名称” 现在列在 MySQL 官方文档的 “关键字和保留字” 列表中。你可以在那里找到所有的保留字。

参考:https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-N

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多