【问题标题】:MySql table names and field names within quotations引号内的MySql表名和字段名
【发布时间】:2010-03-05 07:18:29
【问题描述】:

我有一堆自动生成的 PHP 代码,它将所有表名和字段名放在引号内。也就是说:

INSERT INTO "t_ML_u_Visitor"("c_u_ID") VALUES ...

由于代码是自动生成的,如果我能以某种方式让 MySql 接受这种语法,而不是让生成的代码接受去除引号的后处理,那将是更可取的。

我试过这个:

$conn=$mysqli = new mysqli("localhost", "root", "", "myDB");
$R=$conn->options(MYSQLI_INIT_COMMAND, "SET SQL_MODE = 'ANSI'"); 

但无济于事。

帮助?

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

    正常的引号字符是反引号 - 例如

    create table `quoted`( `v` varchar(10) );
    

    您能否更改自动生成的查询使用的引号字符以适应?

    编辑:我刚刚尝试了 ANSI 模式,它可以满足您的要求:

    set @session sql_mode = ANSI;
    create table "world"( "v" varchar(10));
    

    问题就变成了双引号不能再用于引用文字字符串了。

    【讨论】:

    • 我不使用 PHP,但我认为您只需像使用 $conn->query() 命令的任何其他 SQL 语句一样单独运行“设置会话”语句:它的效果将适用于连接到数据库的持续时间。
    【解决方案2】:

    MySQL 使用反引号 (`) 转义。 您的查询将如下所示:

    INSERT INTO `t_ML_u_Visitor` (`c_u_ID`) VALUES (...)
    

    如果您使用的是 PHP 和 Mysqli(如我所见),您可以像这样使用 mysqli 的函数 real_escape_string():

    $conn = new mysqli("localhost", "root", "", "myDB");
    $query = "INSERT INTO t_ML_u_Visitor (c_u_ID) VALUES (...)";
    $escaped = $conn->real_escape_string($query);
    $result = $conn->query($escaped);
    

    另请参阅:http://de2.php.net/manual/en/mysqli.real-escape-string.php

    【讨论】:

    • No No No... 我意识到我可以简单地删除引号并修复所有问题。报价已经在那里了。我想从 PHP 中将 SQL_MODE 设置为 ANSI,并让它在不从所有自动生成的查询中删除引号的情况下工作。
    • hmm..我查了一些东西,找到了使用mysqli的joomla的源代码。正如马丁所说,他们只使用$conn->query("SET SQL_MODE = 'ANSI'");。抱歉误解了您的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2013-03-15
    • 1970-01-01
    • 2013-03-10
    • 2014-03-03
    相关资源
    最近更新 更多