MySQL双引号表名

8

我正在执行一个类似于MySQL查询的操作:

Select * from "User";

然后它返回:

您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以了解正确使用语法的方法,在1行附近的位置“User”

这个错误与双引号"有关,我能保持选择语句不变,并让mysql处理双引号吗?


这段代码不是我写的,这个应用程序已经构建完成,这种约定可以在整个应用程序中使用。 - Mohamed Wagdy Khorshid
双引号是标准 ANSI 标识符的分隔符。你的 sql_mode 是什么?是否存在名为 User、user、USER 或类似名称的表?服务器操作系统的大小写敏感度是什么? - pilcrow
sql_mode的原始值是: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 然后我执行了"SET GLOBAL sql_mode = 'ANSI';"之后它变成了: REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI - Mohamed Wagdy Khorshid
当运行 "select * from user" 时,它会正确执行。 - Mohamed Wagdy Khorshid
1个回答

14

以下内容摘自这篇帖子

SET GLOBAL SQL_MODE=ANSI_QUOTES;

就我个人的测试经验而言,我必须这样做:

SET SQL_MODE=ANSI_QUOTES;

我认为没有其他的方法。

http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_ansi_quotes

ANSI_QUOTES

将“"”视为标识符引用字符(类似于“`”引用字符),而不是字符串引号字符。启用此模式后,仍可以使用“`”引用标识符。如果启用了 ANSI_QUOTES,则不能使用双引号引用文字字符串,因为它被解释为标识符。


它成功了!!!但是 GLOBAL SQL_MODE 和 SQL_MODE 有什么区别? - Mohamed Wagdy Khorshid
说实话,我不太确定 - SQL 不是我的强项。这两个查询对我来说都可以运行,但是 GLOBAL 这个似乎没有起到任何作用。 - Wesley Murch
2
SET SESSION SQL_MODE=ANSI_QUOTES;是另一种可能更合理的方法。请参阅:http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html。正如我所说,我不是SQL专家,因此您可能需要研究任何副作用、注意事项等。 - Wesley Murch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接