这个PHP-MySQL CREATE TABLE查询有什么问题?

What's wrong with this PHP-MySQL CREATE TABLE query?

提问人:Jeff 提问时间:1/8/2010 最后编辑:OMG PoniesJeff 更新时间:2/3/2011 访问量:1748

问:

首先,我刚刚开始用PHP学习MySQL。

我的查询直接从我的 IDE 复制/粘贴:

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
                id       int(11)        unsigned  NOT NULL  auto_increment,
                show     tinyint(1)     unsigned  NOT NULL  default '0',
                to       varchar(255)             NOT NULL  default '',
                from     varchar(255)             NOT NULL  default '',
                type     varchar(255)             NOT NULL  default '',
                message  varchar(255)             NOT NULL  default '',
                PRIMARY KEY(id)
             ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";

$result = mysql_query( $query, $link ) OR exit ( mysql_error() );

导致此错误:

您的 SQL 语法有错误; near 'show tinyint(1) unsigned NOT NULL 默认值为 '0',更改为 varchar(255) N' 在 4 号线

...所以我在(例如)中添加一个字符并得到此错误:showshowz

您的 SQL 语法有错误; near 'to varchar(255) 不为 NULL default '' , from varchar(255) 不是 NUL' 在第 5 行

...所以我在(例如)中添加一个字符并得到此错误:totoz

您的 SQL 语法有错误; near 'from varchar(255) 不为 NULL default '' , type varchar(255) NOT NU' 在 6 号线

...所以我添加一个字符(例如)并且它有效!?fromfromz

这是怎么回事?不。

如果这个问题太明显了,如果社区认为这是谨慎的,我会删除它,但与此同时,我被难住了。

顺便说一句,我搞砸了间距、大小写和其他东西,但没有任何成功。

PHP 的MySQL

评论

0赞 OMG Ponies 1/8/2010
我不建议默认为零长度字符串

答:

4赞 Tatu Ulmanen 1/8/2010 #1

SHOW,并且是保留的 MySQL 关键字。您必须用反引号引用它们,以使它们用作列名:TOFROM

$query = "CREATE TABLE IF NOT EXISTS $table_messages (
    `id` int(11) unsigned NOT NULL auto_increment,
    `show` tinyint(1) unsigned NOT NULL default '0' ,
    `to` varchar(255) NOT NULL default '' ,
    `from` varchar(255) NOT NULL default '' ,
    `type` varchar(255) NOT NULL default '' ,
    `message` varchar(255) NOT NULL default '' ,
    PRIMARY KEY(id)
) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1";

通常,以这种方式引用每个列名称是很好的做法(尽管不需要),以防止与关键字发生意外冲突,因为关键字有数百个。有关完整列表,请参阅 http://dev.mysql.com/doc/refman/5.1/en/reserved-words.html

评论

0赞 Jeff 1/8/2010
哇。我认为作为最佳实践,我将始终在我的列名称中包含反引号。谢谢!
2赞 Jeff 1/8/2010
...或者,也许我根本不应该为我的列使用任何保留的MySQL关键字。
0赞 Matt Dawdy 1/8/2010 #2

只是在黑暗中捅了一刀,但是在mysql中是来回保留字吗?你能不能把这些词用[to]和[from]来包装,或者像你一样,把这些词改成toperson或fromperson?

2赞 Boldewyn 1/8/2010 #3

您可能对 MySQL 语句中的保留字列表感兴趣。简而言之,如果要将其中任何一个用作列名(或在以下查询中的任何位置),则必须引用它们,通常用反引号括起来:

`show` TINYINT(1) UNSIGNED NOT NULL,

...以及以后:

SELECT `show` FROM `varchar` WHERE `to`="France"
0赞 d-_-b 2/3/2011 #4

这不是您问题的答案,而是“PHP-MySQL CREATE TABLE 查询有什么问题?(对于另一位 Google 员工)

也许不是所有版本的 PHP 都是这样的,但在我的环境中,当我尝试制作表格时,像“mysql_query”这样的非 PDO 命令会抛出错误:

CREATE TABLE IF NOT EXISTS `actionlog`

错误:

You have an error in your SQL syntax

与 PDO 适配器配合使用即可。