精华内容
下载资源
问答
  • 引号完全引用
    2020-01-12 00:20:02

    引用

    在第五章中讲到shell中的引用,shell能识别到4种不同的引用字符:

    • 单引号’
    • 双引号"
    • 反斜线\
    • 反引号`

    前两种和最后一种必须成对出现,而反斜线可以在命令中根据需要多次出现,这些引用字符在shell中的含义和功能各不相同。

    单引号’

    shell碰到第一个’,在遇到用于封闭的’之前,shell会忽略单引号对中引用的所有特殊字符,即不再解释字符串中任何特殊字符,对内容的保护比较强,单引号最常见的地方就是一个字符串参数中含有空格时,shell通常会使用空格作为分割符,将一个字符串解释成了多个字符串参数,如下例:

    $ echo one      teo    three four
    one teo three four
    $ echo 'one      teo    three four'
    one      teo    three four
    

    双引号"

    双引号的作用类似于单引号,除了对于内容的保护要弱于后者,双引号会忽略引用的大部分特殊字符。具体来说,下面3个字符在双引号中不会被忽略:

    • 美元符号 $
    • 反引号 `
    • 反斜线 \
    touch file{01..10}
    filelist=*
    echo $filelist
    file01 file02 file03 file04 file05 file06 file07 file08 file09 file10
    echo '$filelist'
    $filelist
    echo "$filelist"
    *
    

    上面的例子中对比了不使用引号,使用单引号以及使用双引号之间的主要不同,在第3行中shell看到了星号并将其替换成当前目录下的所有文件名, 在第5行中,shell完全不处理单引号中的字符,因此显示出了" f i l e l i s t " , 在 第 7 行 中 双 引 号 指 示 s h e l l 需 要 在 其 中 执 行 变 量 名 替 换 , 因 此 s h e l l 将 " filelist", 在第7行中双引号指示shell需要在其中执行变量名替换,因此shell将" filelist"7shellshell"filelist"解释为"",因为文件名不会再双引号中完成,所以被只有""被传递给了echo。

    当字符串中含有单引号或双引号时,可以使用双引号来保留单引号,反之亦然。

    x=" hello, 'world'"
    echo $x
    hello, 'world'
    y=' hello, "world"'
    echo $y
    hello, "world"
    

    反斜线\

    除了少数几处例外,反斜线(作为前缀使用)在功能上相当于在单个字符周围放置单引号,反斜线可以对紧随其后的字符进行转义。

    echo >
    -bash: syntax error near unexpected token `newline'
    echo \>
    >
    x=*
    echo \$x
    $x
    

    如上,shell忽略了反斜线之后的>和$x,所以不在执行变量替换。

    当反斜线作为一行最后一个字符时,shell将其视为续行符,会删除随后的换行符,也不会将该换行符作为参数分隔符(假装这个字符没出现过)。在输入跨多行的长命令时经常用这种方法。

    $ echo "1234\
    > 5678\
    > 90"
    1234567890
    

    值得注意的是反斜线的作用在双引号中也是有效的,但在单引号中被作为普通字符处理

    反引号`

    反引号不像之前碰到的那些引号,因为它的功能和用法和前面那三种完全不同。反引号用于告诉shell将其中的命令使用命令输出代替, shell会先执行反引号或者 ( ) 中 的 指 令 , 将 输 出 插 入 到 对 应 的 位 置 中 。 反 引 号 和 ()中的指令,将输出插入到对应的位置中。反引号和 ()(…)在功能上是一样的,只是$(…)是一种更新更可取的命令替换写法。反引号的一般使用格式为:

    `command`
    
    echo The date and time is: `date`
    The date and time is: Sun Jan 5 15:17:27 CST 2020
    echo The date and time is: $(date)
    The date and time is: Sun Jan 5 15:17:39 CST 2020
    
    name="AbcDefg"
    #转化为大写
    name=$(echo $name | tr '[a-z]' 'A-Z')
    echo $name
    ACDDFGH
    
    更多相关内容
  • 经过几天的混乱引用,总算搞明白了一些,简单总一下三者的使用和区别。单引号 ‘’单引号里的内容全部以普通字符的含义进行文本使用和解释,不管是特殊字$,还是转义字符\,它关闭了Shell中所有特殊符号使用和解释。...

    首先向马哥和马哥团队敬个礼,谢谢你们带我进入Linux的世界,刚开始接触linux时,经常看到单引号、双引号和反引号特殊符号,经常搞混淆和误用,应该用双引号,有时用到单引号。经过几天的混乱引用,总算搞明白了一些,简单总一下三者的使用和区别。

    单引号 ‘’

    单引号里的内容全部以普通字符的含义进行文本使用和解释,不管是特殊字$,还是转义字符\,它关闭了Shell中所有特殊符号使用和解释。例如:

    3c8ce6380daa33c267ccb0e2e66a02de.png

    1.给变量name赋值stone

    2.echo '$name'返回值:$name

    3.完全引用单引号的内容

    双引号 “”

    它关闭了Shell中大部的特殊符号,但保留了某些,比如$,转义符\;反引号字符和单引号字符在双引号中作为普通字符,不具备特殊功能和作用。例如:

    3c8ce6380daa33c267ccb0e2e66a02de.png

    1.还是给变量name赋值stone

    2.echo "$name"

    3.此时输出name的值为stone。

    反引号“

    反引号最容易让我搞错,直到后面看到马哥写Shell语句多了才明白,反引里面的字符串必须是能执行的命令,否则会出错;它的作用是命令替换,将其中的字符串当成Shell命令执行,返回命令的执行结果;例如:

    3c8ce6380daa33c267ccb0e2e66a02de.png

    echo `date +%Y%m%d`显示今天的日期,假如反引号中的字符品不是能执行的命令就会报错,如下图:

    3c8ce6380daa33c267ccb0e2e66a02de.png

    提示stone命令没有找到,因为系统没有stone这条命令。另外$()和“的功能作用有同样的效果。

    原创文章,作者:stoneguo,如若转载,请注明出处:http://www.178linux.com/6644

    展开全文
  • 促使我想写这个系列的文章,是因为看到总有人提到相同的问题,犯相同的错误,曾经我也是这么过来的,不忍心看到后面还有人经常这么曲折的过来
  • 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法。例:$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';此外,在上面的示例中,考虑table,col1,val1等可以是变量...

    我正在尝试学习编写查询的最佳方法。 我也理解保持一致的重要性。 到现在为止,我已经随机使用单引号,双引号和反引号而没有任何实际想法。

    例:

    $query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

    此外,在上面的示例中,考虑table,col1,val1等可以是变量。

    这是什么标准? 你是做什么?

    我一直在这里阅读类似问题的答案大约20分钟,但似乎没有明确答案这个问题。 sub>

    请注意,这是一个特定于MySQL的问题。 一般而言,SQL(即ISO / ANSI SQL)具有不同的引号集:双引号用于分隔标识符,例如, "tablename",单引号用于文字,例如'this is a some text'。 反向标记从不在标准SQL中使用。 (如果需要在标识符中包含双引号,请将其键入两次"odd""tablename"。同样,文字中的双引号,如'Conan O''Brien'。)

    反引号用于表和列标识符,但仅在标识符是MySQL保留关键字时,或者当标识符包含空格字符或超出有限集的字符时才需要(见下文)。通常建议避免使用保留关键字尽可能作为列或表标识符,避免引用问题。

    单引号应该用于VALUES()列表中的字符串值。 MySQL也支持双引号用于字符串值,但单引号被其他RDBMS更广泛地接受,因此使用单引号而不是双引号是一个好习惯。

    MySQL还希望DATE和DATETIME文字值单引号为'2001-01-01 00:00:00'之类的字符串。有关更多详细信息,请参阅日期和时间文字文档,特别是在日期字符串中使用连字符-作为段分隔符的替代方法。

    因此,使用您的示例,我会双引号PHP字符串并在值'val1', 'val2'上使用单引号。 NULL是MySQL关键字和特殊(非)值,因此不带引号。

    这些表或列标识符都不是保留字或使用需要引用的字符,但我还是用反引号引用它们(稍后会详细介绍......)。

    不应引用RDBMS本机函数(例如,MySQL中的NOW()),尽管它们的参数受到已经提到的相同字符串或标识符引用规则的约束。

    Backtick (`)

    table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐

    ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`)

    VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";

    ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑

    Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││

    Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││

    Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││

    Unquoted function         ─────────────────────────────────────────┴┴┴┴┘

    可变插值

    变量的引用模式不会改变,但如果您打算直接在字符串中插入变量,则必须在PHP中使用双引号。只需确保已正确转义变量以便在SQL中使用。 (建议使用支持预处理语句的API,以防止SQL注入)。

    // Same thing with some variable replacements

    // Here, a variable table name $table is backtick-quoted, and variables

    // in the VALUES list are single-quoted

    $query ="INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

    准备好的陈述

    使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。 PHP,PDO和MySQLi中最流行的API可以使用未加引号的占位符,其他语言中的大多数预处理语句API也是如此:

    // PDO example with named parameters, unquoted

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

    // MySQLi example with ? parameters, unquoted

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

    需要在标识符中引用反引号的字符:

    根据MySQL文档,您不需要使用以下字符集引用(反引号)标识符:

    ASCII: [0-9,a-z,A-Z$_] (basic Latin letters, digits 0-9, dollar, underscore)

    您可以使用超出该组的字符作为表或列标识符,例如包括空格,但是您必须引用(反引号)它们。

    "但单引号被其他RDBMS更广泛接受" - 使用单引号作为字符串文字由SQL标准定义(和必需)

    @a_horse_with_no_name几乎没有人使用ANSI MySQL('|'用于字符串连接 - 真的吗?)

    这不是真的:"MySQL还希望DATE和DATETIME文字值单引号为'2001-01-01 00:00:00'之类的字符串"

    @Kick_the_BUCKET你有其他建议吗?保留它们不带引号会导致它们被解释为整数运算。确实可以使用与-不同的分隔符,但除非没有分隔符,否则引用是必要的dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html

    MySQL密钥/保留字:dev.mysql.com/doc/refman/5.7/en/keywords.html

    列别名和表别名怎么样,如在select col1 as c from my_table中,对于别名"c",用单引号或反引号包装它更好吗?

    @evilReiko MySQL文档似乎没有明确地解决别名引用。它将接受单个,双重或反引号的别名,但可能会受到不同ANSI SQL模式的影响。我不确定SQL规范对别名引号的要求 - 个人偏好:为了保持一致性,我引用它们与列标识符相同 - 也就是说,如果需要,我要么反复引用它们,要么如果没有则不引用它们。我不对别名使用单引号或双引号。

    @MichaelBerkowski如果别名是保留关键字,则需要引用别名。 SQL标准是字符串文字和日期用单引号括起来。对象/实体用双引号括起来。 MySQL使用反引号``是一个奇怪的(尽管普遍存在)异常,而SQL Server使用方括号[]是一种奇怪的(虽然普遍存在)异常。在这两种情况下,都可以使用双引号,我个人认为这是一个好主意,因为它增强了跨不同SQL方言的可移植性和可读性。

    但是,如果单引号用于字符串值,而最外面的引号也是单引号,则整行看起来像:'INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, \'' . $val1 . '\', \'' . $val2 . '\', \'' . $date . '\')';。这会影响可读性。

    使用双引号进行sql查询是否容易受到php变量注入?像:"SELECT * FROM $my_table",url查询类似于?mytable=$all_tables?

    @GuneyOzsan是的,非常脆弱。除非已根据可接受的表名列表进行验证,否则永远不要将变量用于表名 - 创建一个允许的名称数组并检查变量是否与列表中的内容匹配以使其安全使用。否则,您无法安全地转义表名变量以供使用。

    MySQL中有两种类型的引号:

    '用于包含字符串文字

    `用于包含表和列名称等标识符

    然后有"这是一个特例。根据MySQL服务器的sql_mode,它可以一次用于上述目的之一:

    默认情况下,"字符可用于包围字符串文字,就像'一样

    在ANSI_QUOTES模式下,"字符可用于包围标识符,就像`一样

    以下查询将根据SQL模式生成不同的结果(或错误):

    ANSI_QUOTES已禁用

    查询将选择字符串文字"column",其中列foo等于字符串"bar"

    ANSI_QUOTES已启用

    查询将选择列column,其中列foo等于列bar

    什么时候用

    我建议您避免使用",以便您的代码独立于SQL模式

    总是引用标识符,因为这是一个很好的做法(关于SO的很多问题讨论这个)

    (关于你的问题的SQL性质,上面有很好的答案,但如果你是PHP的新手,这也可能是相关的。)

    也许重要的是要提到PHP处理单引号和双引号字符串不同...

    单引号字符串是'文字',几乎是WYSIWYG字符串。 PHP解释双引号字符串可能的变量替换(PHP中的反引号不完全是字符串;它们在shell中执行命令并返回结果)。

    例子:

    $foo ="bar";

    echo 'there is a $foo'; // There is a $foo

    echo"there is a $foo"; // There is a bar

    echo `ls -l`; // ... a directory list

    反引号通常用于表示identifier,并且不会意外地使用保留关键字。

    例如:

    Use `database`;

    这里的反引号将帮助服务器理解database实际上是数据库的名称,而不是数据库标识符。

    可以对表名和字段名执行相同的操作。如果用反引号包装数据库标识符,这是一个非常好的习惯。

    Check this answer to understand more about backticks.

    现在关于双引号和单引号(迈克尔已经提到过)。

    但是,要定义一个值,您必须使用单引号或双引号。让我们看另一个例子。

    INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

    在这里,我故意忘记用引号包装title1。现在服务器将title1作为列名(即标识符)。因此,要表明它是一个值,您必须使用双引号或单引号。

    INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');

    现在,结合PHP,双引号和单引号使您的查询编写时间更容易。让我们在您的问题中看到查询的修改版本。

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

    现在,在PHP中使用双引号,您将使变量$val1和$val2使用它们的值,从而创建一个完全有效的查询。喜欢

    $val1 ="my value 1";

    $val2 ="my value 2";

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

    会做的

    INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')

    在MySQL中,这些符号用于分隔查询`,",'和()。

    "或'用于包含类似字符串的值"26-01-2014 00:00:00"或'26-01-2014 00:00:00'。这些符号仅用于字符串,而不是now,sum或max等聚合函数。

    `用于封闭表名或列名,例如select `column_name` from `table_name` where id='2'

    (和)只是包含查询的部分内容,例如select `column_name` from `table_name` where (id='2' and gender='male') or name='rakesh'。

    MySQL和PHP中的字符串文字是相同的。

    A string is a sequence of bytes or characters, enclosed within either

    single quote ("'") or double quote (""") characters.

    因此,如果您的字符串包含单引号,那么您可以使用双引号来引用字符串,或者如果它包含双引号,那么您可以使用单引号来引用字符串。但是,如果您的字符串包含单引号和双引号,则需要转义用于引用字符串的字符串。

    大多数情况下,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。

    $query ="INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

    你可以在PHP的双引号字符串中使用一个变量:

    $query ="INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

    但是如果$val1或$val2包含单引号,那将导致您的SQL出错。所以你需要在sql中使用之前将其转义;这就是mysql_real_escape_string的用途。 (虽然准备好的陈述更好。)

    这里有很多有用的答案,通常最终分为两点。

    BACKTICKS(`)用于标识符名称。

    单引号(')用于值。

    和@MichaelBerkowski说

    Backticks are to be used for table and column identifiers, but are

    only necessary when the identifier is a MySQL reserved keyword, or

    when the identifier contains whitespace characters or characters

    beyond a limited set (see below) It is often recommended to avoid

    using reserved keywords as column or table identifiers when possible,

    avoiding the quoting issue.

    但是有一种情况,即标识符既不是保留关键字,也不包含有限集之外的空格或字符,但必须围绕它们进行反引号。

    123E10是有效的标识符名称,但也是有效的INTEGER文字。

    [没有详细说明如何获得这样的标识符名称],假设我想创建一个名为123456e6的临时表。

    反推没有错误。

    DB [XXX]> create temporary table `123456e6` (`id` char (8));

    Query OK, 0 rows affected (0.03 sec)

    不使用反引号时出错。

    DB [XXX]> create temporary table 123451e6 (`id` char (8));

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

    但是,123451a6是一个非常精细的标识符名称(没有后退标记)。

    DB [XXX]> create temporary table 123451a6 (`id` char (8));

    Query OK, 0 rows affected (0.03 sec)

    这完全是因为1234156e6也是一个指数。

    结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易。

    $query ="INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

    现在,假设您正在使用直接post变量进入MySQL查询,那么使用它:

    $query ="INSERT INTO `table` (`id`, `name`, `email`) VALUES ('".$_POST['id']." ', '".$_POST['name']." ', '".$_POST['email']." ')";

    这是将PHP变量用于MySQL的最佳实践。

    因此,双引号是灵活的,但不能用作标识符。

    请勿在查询中直接使用未转义的用户输入!

    @jankal这只是例子。我指定如果你使用直接用户输入那么n然后...........

    @vipulsorathiya请在答案中指明POST变量应该被转义。您现在指的是直接在查询中使用它们。试试这个的初学者不好...

    如果表cols和values是变量,那么有两种方法:

    使用双引号""完整查询:

    $query ="INSERT INTO $table_name (id, $col1, $col2)

    VALUES (NULL, '$val1', '$val2')";

    要么

    $query ="INSERT INTO".$table_name." (id,".$col1.",".$col2.")

    VALUES (NULL, '".$val1."', '".$val2."')";

    使用单引号'':

    $query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')

    VALUES (NULL, '.$val1.', '.$val2.')';

    当列/值名称类似于MySQL保留关键字时,请使用返回ticks ``。

    注意:如果您使用表名表示列名,那么请使用这样的返回标记:

    `table_name`。 `column_name` < - 注意:从后面的刻度中排除.。

    单引号应该用于字符串值,如VALUES()列表中所示。

    反引号通常用于表示标识符,并且不会意外地使用保留关键字。

    结合PHP和MySQL,双引号和单引号使您的查询编写时间变得更加容易。

    除了所有(解释清楚的)答案之外,还没有提到以下内容,我经常访问此问答。

    简而言之; MySQL认为你想在自己的表/列上进行数学运算,并将诸如"电子邮件"之类的连字符解释为e减去mail。

    免责声明:所以我认为我会将此作为"FYI"类型的答案添加到那些完全不熟悉数据库并且可能不理解已经描述的技术术语的人那里。

    SQL服务器和MySQL,PostgreySQL,Oracle不理解双引号(")。因此,您的查询应该没有双引号("),并且应该只使用单引号(')。

    回溯(`)是在SQL中使用的可选项,用于表名,数据库名和列名。

    如果您尝试在后端编写查询来调用MySQL,那么您可以使用双引号(")或单引号(')将查询分配给变量,如:

    let query ="select id, name from accounts";

    //Or

    let query = 'select id, name from accounts';

    如果你的查询中有一个where语句和/或试图insert一个值和/或一个update值的字符串,请使用单引号(')来表示这些值:

    let querySelect ="select id, name from accounts where name = 'John'";

    let queryUpdate ="update accounts set name = 'John' where id = 8";

    let queryInsert ="insert into accounts(name) values('John')";

    //Please not that double quotes are only to be used in assigning string to our variable not in the query

    //All these below will generate error

    let querySelect = 'select id, name from accounts where name ="John"';

    let queryUpdate = 'update accounts set name ="John" where id = 8';

    let queryInsert = 'insert into accounts(name) values("John")';

    //As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

    如果你想在使用双引号(")和单引号(')时避免这种混淆,建议坚持使用单引号(')这将包括反斜杠(),如:

    let query = 'select is, name from accounts where name = \'John\'';

    当我们必须为动态分配一些值并执行一些字符串连接时,会出现double(")或single(')引号的问题:

    let query ="select id, name from accounts where name =" + fName +"" + lName;

    //This will generate error as it must be like name = 'John Smith' for SQL

    //However our statement made it like name = John Smith

    //In order to resolve such errors use

    let query ="select id, name from accounts where name = '" + fName +"" + lName +"'";

    //Or using backslash(\)

    let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

    如果需要进一步清除,请遵循JavaScript中的引号

    展开全文
  • 现在,在PHP中使用双引号,您将使变量$val1和$val2使用它们的值,从而创建一个完全有效的查询。 Like 喜欢 $val1 = "my value 1"; $val2 = "my value 2"; $query = "INSERT INTO `table` (`id`, `col1`, `col2`) ...

    本文翻译自:When to use single quotes, double quotes, and backticks in MySQL

    I am trying to learn the best way to write queries. 我正在尝试学习编写查询的最佳方法。 I also understand the importance of being consistent. 我也了解保持一致的重要性。 Until now, I have randomly used single quotes, double quotes, and backticks without any real thought. 到现在为止,我在没有任何实际考虑的情况下随机使用单引号,双引号和反引号。

    Example: 例:

    $query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
    

    Also, in the above example, consider that table , col1 , val1 , etc. may be variables. 另外,在上面的示例中,请考虑tablecol1val1等可以是变量。

    What is the standard for this? 这是什么标准? What do you do? 你是做什么?

    I've been reading answers to similar questions on here for about 20 minutes, but it seems like there is no definitive answer to this question. 我已经在这里阅读了大约20分钟的类似问题的答案,但是似乎没有确切的答案。


    #1楼

    参考:https://stackoom.com/question/lVEh/何时在MySQL中使用单引号-双引号和反引号


    #2楼

    Backticks are to be used for table and column identifiers, but are only necessary when the identifier is a MySQL reserved keyword , or when the identifier contains whitespace characters or characters beyond a limited set (see below) It is often recommended to avoid using reserved keywords as column or table identifiers when possible, avoiding the quoting issue. 反引号用于表和列标识符,但是仅当标识符是MySQL保留关键字时 ,或者当标识符包含空格字符或超出限制集的字符时才需要使用反引号(请参见下文)。通常建议避免使用保留关键字在可能的情况下用作列或表的标识符,从而避免引用问题。

    Single quotes should be used for string values like in the VALUES() list. 单引号应用于VALUES()列表中的字符串值。 Double quotes are supported by MySQL for string values as well, but single quotes are more widely accepted by other RDBMS, so it is a good habit to use single quotes instead of double. MySQL还为字符串值支持双引号,但是单引号已被其他RDBMS广泛接受,因此使用单引号而不是双引号是一个好习惯。

    MySQL also expects DATE and DATETIME literal values to be single-quoted as strings like '2001-01-01 00:00:00' . MySQL还希望DATEDATETIME文字值DATETIME引号括起来,如'2001-01-01 00:00:00''2001-01-01 00:00:00'字符串。 Consult the Date and Time Literals documentation for more details, in particular alternatives to using the hyphen - as a segment delimiter in date strings. 咨询日期和时间文字的更多详细信息的文件,特别是替代使用连字符-在日期字符串段分隔符。

    So using your example, I would double-quote the PHP string and use single quotes on the values 'val1', 'val2' . 因此,使用您的示例,我将对PHP字符串加双引号,并对值'val1', 'val2'使用单引号。 NULL is a MySQL keyword, and a special (non)-value, and is therefore unquoted. NULL是MySQL关键字,是一个特殊的(非)值,因此未加引号。

    None of these table or column identifiers are reserved words or make use of characters requiring quoting, but I've quoted them anyway with backticks (more on this later...). 这些表或列标识符都不是保留字,也不使用需要引号的字符,但是无论如何我都用反引号将它们引号(稍后再说……)。

    Functions native to the RDBMS (for example, NOW() in MySQL) should not be quoted, although their arguments are subject to the same string or identifier quoting rules already mentioned. RDBMS的本机函数(例如,MySQL中的NOW() )不应被引用,尽管它们的参数要遵循已经提到的相同的字符串或标识符引用规则。

    Backtick (`)
    table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
                          ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
    $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                           VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                                   ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
    Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││
    Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││
    Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││
    Unquoted function         ─────────────────────────────────────────┴┴┴┴┘

    Variable interpolation 变量插补

    The quoting patterns for variables do not change, although if you intend to interpolate the variables directly in a string, it must be double-quoted in PHP. 变量的引用模式不会改变,尽管如果您打算直接在字符串中插入变量,则必须在PHP中将其双引号。 Just make sure that you have properly escaped the variables for use in SQL. 只要确保您已正确转义了要在SQL中使用的变量即可。 ( It is recommended to use an API supporting prepared statements instead, as protection against SQL injection ). 建议使用支持预处理语句的API来防止SQL注入 )。

    // Same thing with some variable replacements
    // Here, a variable table name $table is backtick-quoted, and variables
    // in the VALUES list are single-quoted 
    $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

    Prepared statements 准备好的陈述

    When working with prepared statements, consult the documentation to determine whether or not the statement's placeholders must be quoted. 在使用准备好的语句时,请查阅文档以确定是否必须引用语句的占位符。 The most popular APIs available in PHP, PDO and MySQLi, expect unquoted placeholders, as do most prepared statement APIs in other languages: PHP,PDO和MySQLi中最流行的API都希望使用无引号的占位符,其他语言中大多数准备好的语句API也是如此:

    // PDO example with named parameters, unquoted
    $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
    
    // MySQLi example with ? parameters, unquoted
    $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
    

    Characters requring backtick quoting in identifiers: 要求标识符中使用引号引起来的字符:

    According to MySQL documentation , you do not need to quote (backtick) identifiers using the following character set: 根据MySQL文档 ,您不需要使用以下字符集引用(反引号)标识符:

    ASCII: [0-9,az,AZ$_] (basic Latin letters, digits 0-9, dollar, underscore) ASCII: [0-9,az,AZ$_] (基本拉丁字母,数字0-9,美元,下划线)

    You can use characters beyond that set as table or column identifiers, including whitespace for example, but then you must quote (backtick) them. 您可以使用超出设置范围的字符作为表或列标识符,例如,包括空格,但是必须将其引号(反引号)。


    #3楼

    Backticks are generally used to indicate an identifier and as well be safe from accidentally using the Reserved Keywords . 反引号通常用于表示一个identifier和以及从偶然使用安全 保留的关键字

    For example: 例如:

    Use `database`;
    

    Here the backticks will help the server to understand that the database is in fact the name of the database, not the database identifier. 在这里,反引号将帮助服务器了解database实际上是数据库的名称,而不是数据库标识符。

    Same can be done for the table names and field names. 表名和字段名可以做同样的事情。 This is a very good habit if you wrap your database identifier with backticks. 如果用反引号包装数据库标识符,这是一个很好的习惯

    Check this answer to understand more about backticks. 检查答案以了解有关反引号的更多信息。


    Now about Double quotes & Single Quotes (Michael has already mentioned that). 现在有关双引号和单引号(Michael已经提到过)。

    But, to define a value you have to use either single or double quotes. 但是,要定义一个值,您必须使用单引号或双引号。 Lets see another example. 让我们来看另一个例子。

    INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);
    

    Here I have deliberately forgotten to wrap the title1 with quotes. 在这里,我故意忘记了将title1用引号引起来。 Now the server will take the title1 as a column name (ie an identifier). 现在,服务器将title1作为列名(即标识符)。 So, to indicate that it's a value you have to use either double or single quotes. 因此,要表明它是一个值,您必须使用双引号或单引号。

    INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');
    

    Now, in combination with PHP, double quotes and single quotes make your query writing time much easier. 现在,与PHP结合使用,双引号和单引号使您的查询编写时间变得更加轻松。 Let's see a modified version of the query in your question. 让我们看看问题中查询的修改版本。

    $query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
    

    Now, using double quotes in the PHP, you will make the variables $val1 , and $val2 to use their values thus creating a perfectly valid query. 现在,在PHP中使用双引号,您将使变量$val1$val2使用它们的值,从而创建一个完全有效的查询。 Like 喜欢

    $val1 = "my value 1";
    $val2 = "my value 2";
    $query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
    

    will make 将使

    INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
    

    #4楼

    If table cols and values are variables then there are two ways: 如果表cols和value是变量,则有两种方法:

    With double quotes "" the complete query: 用双引号""完成查询:

    $query = "INSERT INTO $table_name (id, $col1, $col2)
                     VALUES (NULL, '$val1', '$val2')";
    

    Or 要么

     $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
                   VALUES (NULL, '".$val1."', '".$val2."')";
    

    With single quotes '' : 用单引号''

    $query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
                 VALUES (NULL, '.$val1.', '.$val2.')';
    

    Use back ticks `` when a column/value name is similar to a MySQL reserved keyword. 当列/值名称类似于MySQL保留关键字时,请使用反斜线``

    Note: If you are denoting a column name with a table name then use back ticks like this: 注意:如果要使用表名来表示列名,请使用像这样的反引号:

    `table_name` . `table_name` `column_name` <-- Note: exclude . `column_name` <-注意:排除. from back ticks. 从后壁虱。


    #5楼

    (There are good answers above regarding the SQL nature of your question, but this may also be relevant if you are new to PHP.) (关于问题的SQL性质,上面有很好的答案,但是如果您不熟悉PHP,这也可能是相关的。)

    Perhaps it is important to mention that PHP handles single and double quoted strings differently... 可能需要提及的是,PHP处理单引号和双引号的字符串的方式有所不同...

    Single-quoted strings are 'literals' and are pretty much WYSIWYG strings. 单引号字符串是“文字”,几乎是所见即所得的字符串。 Double-quoted strings are interpreted by PHP for possible variable-substitution (backticks in PHP are not exactly strings; they execute a command in the shell and return the result). PHP将双引号字符串解释为可能的变量替换(PHP中的反引号并非完全是字符串;它们在Shell中执行命令并返回结果)。

    Examples: 例子:

    $foo = "bar";
    echo 'there is a $foo'; // There is a $foo
    echo "there is a $foo"; // There is a bar
    echo `ls -l`; // ... a directory list
    

    #6楼

    The string literals in MySQL and PHP are the same. MySQL和PHP中的字符串文字相同。

    A string is a sequence of bytes or characters, enclosed within either single quote (“'”) or double quote (“"”) characters. 字符串是字节或字符序列,用单引号(“'”)或双引号(“”“))括起来。

    So if your string contains single quotes, then you could use double quotes to quote the string, or if it contains double quotes, then you could use single quotes to quote the string. 因此,如果您的字符串包含单引号,则可以使用双引号将字符串引起来,或者如果它包含双引号,则可以使用单引号将字符串引起来。 But if your string contains both single quotes and double quotes, you need to escape the one that used to quote the string. 但是,如果您的字符串同时包含单引号和双引号,则需要转义用于对字符串加引号的字符串。

    Mostly, we use single quotes for an SQL string value, so we need to use double quotes for a PHP string. 通常,我们对SQL字符串值使用单引号,因此我们需要对PHP字符串使用双引号。

    $query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
    

    And you could use a variable in PHP's double-quoted string: 您可以在PHP的双引号字符串中使用一个变量:

    $query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
    

    But if $val1 or $val2 contains single quotes, that will make your SQL be wrong. 但是,如果$val1$val2包含单引号,则会使您的SQL错误。 So you need to escape it before it is used in sql; 因此,您需要先对其进行转义,然后才能在sql中使用它; that is what mysql_real_escape_string is for. 这就是mysql_real_escape_string的用途。 (Although a prepared statement is better.) (尽管准备好的陈述会更好。)

    展开全文
  • 引号字符种种

    2021-05-11 10:17:10
    常见的有这三种 ”〞”,这些看起来差不多的双引号对机器来说完全不同,而且差别不仅仅是全角和半角,不同的字符又可能在不同的字体中看起来完全一样!所以当我不得不使用富文本编辑器的时候总是无法抑制内心的烦躁...
  • 您可能已经在在线文章中看到过这样的: 好吧,直到现在,人类不得不花一些时间来选择要引用引号。 该节点模块使用基本的文本摘要技术来查找有趣的句子,以自动用作拉引号。我为什么要这个? 在没有任何实际工作的...
  • rune 为 int32 的别名,它完全等价于 int32,习惯上用它来区别字符值和整数值。rune 表示的是字符的 Unicode 码值。 package main import( "fmt" ) func main(){ var c rune = '你' fmt.Printf("c=%v ct=%T...
  • shell 脚本编程之引用

    2017-07-31 17:55:48
    shell 中字符分为两种,一种是普通字符,另一种是元字符(meta)。元字符是 shell 的保留字符,在 shell 中有着特殊的意义。引用是指将字符串用某种符号括...shell 中有四种引用符,用双引号,单引号,反引号和转义字符。
  • Go语言的字符串类型string在本质上就与其他语言的字符串类型不同: Java的String、C++的std::string以及Python3的str类型都只是定宽字符序列 ...Golang的双引号和反引号都可用于表示一个常量字符串,不同在于: ...
  • 其中同时包含了单引号和双引号一般插入语句为sql = "insert into tb (my_str) values('%s')" % (data)cursor.execute(sql)其中values('%s')中的%s外面也要有引号,这个引号与data中的引号匹配导致了内容错误解决办法...
  • 在mysql中引用字符串常量时候需要用一对英文单引号或者双引号。在一般使用的时候你会发现单引号和双引号没有什么区别。 但是在转义时,我们会使用到单双引号,例如你要查询的字段里面本身就带有单引号或者双引号时,...
  • 我想从bash shell脚本中运行一个命令,该脚本在单引号和变量中包含单引号和一些其他命令。如repo forall -c '....$variable'。在这种格式中,对$进行转义,不展开变量。我尝试了以下变体,但被拒绝:repo forall -c ...
  • 引号用来创建可解析的字符串字面量(支持转义,但不能用来引用多行) 反引号用来创建原生的字符串字面量,这些字符串可能由多行组成(不支持任何转义序列),原生的字符串字面量多用 于书写多行消息、HTML以及正则...
  • HTML标记语言——引用

    2020-09-28 10:32:52
    点击这里返回网页教学网 HTML...上文:标记语言——邪恶表格 原文出处Chapter 4 引用“Misquotations are the only quotations tha are never misquoted” (只有错误的引用永远不会被误用)- Hesketh Pearson所有类型的
  • 引用自:https://blog.csdn.net/zhaoya_huangqing/article/details/48036839一、在组成SQL语句并发送命令时完全按照Python中的样式去传递,这样在MySql中执行的时候就会遇到错误的命令,由单引号或者双引号引起。...
  • 在python中注释掉多行,我们使用三重引号def x():"""This code willadd 1 and 1"""a=1+1但是,如果我必须注释掉已经包含许多其他注释掉代码块(三重引用注释)的代码块,该怎么办。 例如,如果我想完全注释掉此功能。...
  • go语言中不倾向使用单引号表示字符串,单引号用于表示Golang的一个特殊类型:rune,类似其他语言的byte但又不完全一样,是指:码点字面量(Unicode code point),不做任何转义的原始内容。单引号只能引用一个字符。...
  • 1. 单引号(’) 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。如例程中的'-1 day',再比如: $ string=’$PATH’ $ echo $string $PATH ...
  • Linux Shell 单引号引号 使用区别

    千次阅读 2018-05-23 23:49:39
    引号 ' 2. 双引号 " 3. 反引号 ` 单引号 两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思. 双引号 两个双引号包围起来的字符串,部分特殊字符将起到它们的作用. 这些特殊字符有: ...
  • BA’,’C’]这是完全没问题的,但是为什么即使定义了分隔符和quotechar,该字段中间的双引号也会引起问题? 您的csv文件无效.如果引号出现在(引用的)字符串中,则必须通过加倍来对其进行转义. "1";"A";"A:""61 B & BA...
  • 我不完全确定其他 Lisps 的读者在病理性极端案例方面是否完全相同。 未来的工作: 将此作为 lisp-mode 之上的一个额外层来工作,以便突出显示关键字,但在不同的反引号级别上仍然显得有些不同。 直观地指示容易...
  • "":双引号,允许扩展,以 $ 引用其他变量。 '':单引号,禁用扩展,即便 $ 也视为普通字符。 ``:反引号,将命令的执行输出作为变量值,$() 与反引号效果一致,只能放命令。 举例 // "" 使用 $ echo "$USER...
  • 在组成SQL语句并发送命令时完全按照Python中的样式去传递,这样在MySql中执行的时候就会遇到错误的命令,由单引号或者双引号引起.因此应该在组成字符串之前,手动将字符串中的单引号或者双引号之前加上反斜杠,这样在...
  • 现代shell添加了POSIX标准未指定的另一种引用样式,其中前导单引号带有一个美元符号。 Strings so quoted follow similar conventions to string literals in the ANSI C programming language, and are therefore ...
  • 当具有不同身份的单引号紧挨着一起出现在 sql 语句中时常常令人迷惑不解,单引号和双引号在SQL中有什么不同的作用?
  • 在练习爬虫时,需要获取表单数据存入字典中,但是需要给原始数据一个个加单引号,相当麻烦,网上查找到的解决方法都不能够完全解决问题,于是我琢磨着自己解决了,现在就分享给大家 一. 解决方法 1.复制表单数据...
  • Spark sql 单引号'' 使用问题

    千次阅读 2020-03-27 16:37:57
    引号意味着要某个变量所代表的值 如 var q = 111 spark.sql(s"select '$q' as t").show() +---+ | t| +---+ |111| +---+ 去掉单引号 spark.sql(s"select $q as t").show() +---+ | t| +---+ |111| +---+ ...
  • 输出完全一样,故在纯html标签下以上三种写法是完全等效的。 2. 在JS混编情况下html标签的双引号和单引号区别: 转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因...
  • * 通常,所有记录都有完全相同的字段序列。通常都是纯文本文件. * 建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。 * * CSV格式是分隔的数据格式,有字段/列分隔的逗号字符和记录/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,121
精华内容 31,248
关键字:

引号完全引用