最新消息:20210917 已从crifan.com换到crifan.org

【已解决】mysql中操作表的字段名时是否一定要用反引号括起来

MySQL crifan 2543浏览 0评论

折腾:

【记录】Sequel中新建mysql数据库并新建表和相应字段

期间,看到别人:

实现Pyspider爬虫结果的自定义ResultWorker – 简书

https://www.jianshu.com/p/728061db7d4b

<code>    @staticmethod
    def escape(string):
        return '`%s`' % string
</code>

中好像是:

mysql中,key,或字段,难道要用`去包裹起来才行?

但是有些地方:

pyspider的mysql数据存储接口 – CSDN博客

<code>1.  def escape(self,string):  
2.         return '%s' % string 
</code>

好像是没用到的

然后先去搞清楚这个`是怎么叫法

最后终于想起来了:

反引号

然后用:

反引号 英文

知道了是:Backticks

再去搜:

mysql Backticks

mysql – Using backticks around field names – Stack Overflow

MySQL :: MySQL 8.0 Reference Manual :: 9.2 Schema Object Names

MySQL :: MySQL 8.0 Reference Manual :: 5.1.10 Server SQL Modes

【总结】

官网解释的最清楚,翻译大致含义如下:

MySQL中的一些对象,比如:

  • database

  • table

  • index

  • column

  • alias

  • view

  • stored procedure

  • partition

  • tablespace

  • resource group

  • other object

这些对象的名字,被叫做 标识符 identifier

而标识符的所允许的字符是有一定的限制的

有些标识符是在某些情况下是区分大小写的

对于一个标识符来说,可能被引起来quoted,也可能是没有被引起来unqoted

  • 如果包含特殊字符,后者是系统保留字,则必须要被quote

  • 对于普通的标识符

    • 如果不quote的话,所允许的字符有:

      • 0-9数字,a-Z的字母,美元符号$,下划线_

      • 扩展的Unicode字符:U+0080 .. U+FFFF

    • 对于quote的标识符的话,所允许的字符有:

      • 基本的ASCII字符: U+0001 .. U+007F

      • 扩展的Unicode字符: U+0080 .. U+FFFF

  • 不论是quote还是unquote,都不允许:

    • ASCII NUL (U+0000)

    • supplementary characters (U+10000 and higher)

  • 标识符中可以以数字开头,但是要quote,且不能只是数字

  • Database, table, column的名字最后不能以空格结尾

对于quote的字符:

  • 标准的来说是:反引号 == ` == backticks

举例:

<code>mysql&gt; SELECT * FROM `select` WHERE `select`.id &gt; 100;
</code>
  • 如果启用了ANSI_QUOTES的SQL模式的话,则也可以用 双引号 == “” 去quote

举例:

<code>mysql&gt; CREATE TABLE "test" (col INT);
ERROR 1064: You have an error in your SQL syntax...
mysql&gt; SET sql_mode='ANSI_QUOTES';
mysql&gt; CREATE TABLE "test" (col INT);
Query OK, 0 rows affected (0.00 sec)
</code>

ANSI_QUOTES模式的话,会使得系统把双引号内的字符,作为标识符

同时也意味着,对于普通的字符串来说(本来是用双引号括起来的),现在只能用单引号 == ‘ 去括起来了。

关于ANSI_QUOTES,详见:

MySQL :: MySQL 8.0 Reference Manual :: 5.1.10 Server SQL Modes

下面再来说一些,更加特殊的情况:

quote字符,比如反引号,双引号,也是可以被括起来,放在标识符里的,不过是:

如果被quote起来的字符,包含了quote字符本身,就需要写两次

举例:

<code>mysql&gt; CREATE TABLE `a``b` (`c"d` INT);
</code>

解释:

此处的table的标识符名字是:

<code>a`b
</code>

由于外部的quote引起来的字符用的是反引号`

所以a和b中间的反引号,要写成2遍,变成:

<code>a``b
</code>

被quote引起来就是:

<code>`a``b`
</code>

而对于另外的一个(只有启用了ANSI_QUOTES)quote字符:双引号 “来说,由于外部的quote字符不是双引号,所以不用写2遍,所以可以写成:

<code>`c"d`
</code>

对比标识符的命名来说:

不建议用数字开头,比如:Me MeN,其中M和N是数字

总之:

为了避免其他副作用,尽量只用普通的字符:0-9,a-Z,下划线

去命名,作为标识符

-》

  • 一是省去了quote的考虑

    • 避免其他不必要的麻烦

  • 二是也是好的编程和设计的原则和规范

而对于此处的:

写mysql的代码中,是否一定要用别人那种escape的写法?

  • 如果自己的标识符变量命名,都是很规则,比如我的cityDealerPrice,modelStatus等等,没有包含特殊的容易导出解析错误的单词或字符,那就不需要用`去quote

  • 如果不能确保标识符是普通的字符,比如标识符中可能出现空格或其他特殊字符,或者是系统保留字,则最好是用上`去quote起来,以防万一。

转载请注明:在路上 » 【已解决】mysql中操作表的字段名时是否一定要用反引号括起来

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
99 queries in 0.211 seconds, using 23.34MB memory