共计 1519 个字符,预计需要花费 4 分钟才能阅读完成。
今天客户那边遇到了一个比较奇葩的问题跑来问我,这个问题比较冷门,所以特别记录下。
问题描述
数据库的字段存在斜杠或者空格的时候,怎么用 sql 进行 insert 或者 select 操作。
问题解答
对于这种特殊字符,我们一般想到的是用转义符进行处理,所以试了下 ”/”、引号、单引号等常见的转义符,发现依然语法错误,又查了下 MySQL 的官方说明:
特殊字符位于列名中时必须进行转义,如果列名中包含 \t,(,),/,\,=,<,>,+,-,*,^,”,’,[,],~,#,|,&,% 则必须用中括号括起来。eg:列名为 Column#,应写为 [Column#];列名包括中括号,必须使用斜杠进行转义,eg:列名为 Column[] 的列应写为[Column[\]](只有第二个中括号必须转义)。
以中括号的形式进行转义,然后又试了下中括号,发现依然还是不行。
通过搜索,最后找到需要以反引号“`”(一般键盘的左上角数字 1 左边的那个键)来处理。
其它反引号的用法
之前对反引号几乎没有使用过,所以借此机会搜索总结了下反引号相关的用法。
Linux 反引号的作用
特殊的赋值
Shell 中可以将数字或字符直接赋予变量,也可以将 Linux 命令的执行结果赋予变量,如下:
(1) $ count=9 #将数字赋予变量 count
(2) $ name=”ming” #将字符赋予变量 name
(3) $ listc=`ls -la` #将 Linux 命令赋予 listc,listc 的值就是该命令的执行结果
反引号的作用
反引号的作用就是将反引号内的 Linux 命令先执行,然后将执行结果赋予变量。尽管可以通过输入字符或者字符串来创建变量值,也可以获取来自于其他 Linux 命令的值。为把 Linux 命令的结果赋予变量,实现需要执行这个命令。如果在命令行上把 Linux 命令放在反引号中,这个命令会首先被执行,其结果会成为命令行的一个参数。在赋值时,通过把命令放在反引号中,以便于首先执行,命令的执行结果会被赋予一个变量。反引号可以被视为由要执行命令组成的表达式,其结果会被赋予变量。组成命令的字符本身不会被赋予。在下面的范例中,命令 ls .c 被执行,其结果然后被赋予变量 listc。ls .c 会生成具有.c 扩展名的所有文件列表。这个文件列表随后被赋予变量 listc。
总结
反引号里面的字符串必须是能执行的命令,否则会出错;它的作用是命令替换,将其中的字符串当成 Shell 命令执行,返回命令的执行结果。
mysql 中反引号的作用
为了区分 MYSQL 的保留字与普通字符而引入的符号
举个例子:SELECT `select` FROM `test` WHERE select=’ 字段值 ’
在 test 表中,有个 select 字段,如果不用反引号,MYSQL 将把 select 视为保留字而导致出错,所以,有 MYSQL 保留字作为字段的,必须加上反引号来区分。
引号一般用在字段的值, 如果字段值是字符或字符串,则要加引号,如:select=’ 字段值 ’
不加反引号建的表不能包含 MYSQL 保留字,否则出错
反引号 `,数字 1 左边的符号
保留字不能用于表名,比如 desc,此时需要加入反引号来区别,但使用表名时可忽略反引号。
create table desc 报错
create table `desc` 成功
create table `test` 成功
drop table test 成功
保留字不能用于字段名,比如 desc,此时也需要加入反引号,并且 insert 等使用时也要加上反引号。
create table `test`(`desc` varchar(255))成功
insert into test(desc) values(‘fxf’) 失败
insert into test(`desc`) values(‘fxf’) 成功
: