SQL语句中列名前的@符号是什么意思?

10

我在一个PHP文件中有一个INSERT语句,在列名前面出现了at符号(@)。

@field1, @field2,

这是一个MySQL数据库。at符号的意思是什么?

编辑:
PHP脚本中没有SET @field1 := 'test'。PHP脚本读取csv并将数据放入表中。它可以被误用作注释功能吗?

<?php
$typo_db_username = 'xyz';  //  Modified or inserted by TYPO3 Install Tool.
$typo_db_password = 'xyz';  //  Modified or inserted by TYPO3 Install Tool.

// login
$_SESSION['host'] = "localhost";
$_SESSION['port'] = "3306";
$_SESSION['user'] = $typo_db_username;
$_SESSION['password'] = $typo_db_password;
$_SESSION['dbname'] = "database";


$cxn = mysqli_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['password'], $_SESSION['dbname'], $_SESSION['port']) or die ("SQL Error:" . mysqli_connect_error() );
mysqli_query($cxn, "SET NAMES utf8");

$sqltrunc = "TRUNCATE TABLE tablename";
$resulttrunc = mysqli_query($cxn,$sqltrunc) or die ("Couldn’t execute query: ".mysqli_error($cxn));

$sql1 = "
LOAD DATA LOCAL
INFILE 'import.csv'
REPLACE
INTO TABLE tablename
FIELDS
TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '\"'
IGNORE 1 LINES
(
`normalField`,
@field1,
@field2,
`normalField2`,
@field3,
@field4
)";

$result1 = mysqli_query($cxn,$sql1) or die ("Couldn’t execute query: " . mysqli_error($cxn));


?>'

解决方案:

终于找到了!@字段被用作在csv文件中省略某一列的虚拟字段。请参见http://www.php-resource.de/forum/showthread/t-97082.html http://dev.mysql.com/doc/refman/5.0/en/load-data.html


@testing - 我看到你在自己的问题中添加了一个“可能重复”的标记,因此我基于这个理由投了一票关闭。你能否澄清一下这是否回答了你的问题? - Martin Smith
这不是重复的问题,链接询问普通变量和@var之间的区别,而这个问题询问查询中的@xyz的含义。 - Johan
如果您在查询中包含相关的 PHP 代码,那么更容易获得具体的结果。 - Johan
可能是重复的问题:MySQL:@variable vs. variable。有什么区别? - Yuck
1个回答

12

@符号在SQL中是一个变量。

在MySQL中,它被用来存储在连续运行查询之间的值,或在两个不同的查询之间传输数据。

一个例子:

在两个查询之间传输数据

SELECT @biggest:= MAX(field1) FROM atable;
SELECT * FROM bigger_table WHERE field1 > @biggest;

另一个用途是在排名中,而MySQL没有原生支持。

为查询的连续运行存储一个值

INSERT INTO table2
  SELECT @rank := @rank + 1, table1.* FROM table1
  JOIN( SELECT @rank := 0 ) AS init
  ORDER BY number_of_users DESC

需要注意的是,为使此代码生效,查询中处理行的顺序必须固定,很容易出错。

参见:
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
mysql sorting and ranking statement
http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

更新
此代码永远不会生效。
连接已在之前打开,@fields 未设置任何值。
另外,“@vars”只能用于表示值,不能用于表示字段名称。

$sql1 = "
LOAD DATA LOCAL INFILE 'import.csv'
REPLACE INTO TABLE tablename
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'
IGNORE 1 LINES
(`normalField`, @field1, @field2, `normalField2`, @field3, @field4)";

这个值可以存储在另一个PHP脚本中吗?它能够跨越PHP文件的边界使用吗?因为这些值从未在脚本中设置... - testing
不,@vars 是与连接相关的。您无法在连接之间传输它们。 - Johan
这个脚本不是我写的。我必须对它进行更正... 你的意思是导入了空值。这会有什么后果?最好的解决方案是替换或删除那些字段? - testing
1
我的意思是代码永远不会起作用,因为它存在语法和逻辑错误。我会用字段的字面名称替换@field。如果您坚持使用动态字段名,请先阅读此问题:https://dev59.com/3G025IYBdhLWcg3wwo2l,并确保在注入它们之前将这些字段名列入白名单。 - Johan

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