MySQL转义字符和系统变量

MySQL转义字符

        在 MySQL 中,除了常见的字符之外,我们还会遇到一些特殊的字符,如换行符、回车符等。这些符号无法用字符来表示,因此需要使用某些特殊的字符来表示特殊的含义,这些字符就是转义字符。

        转义字符一般以反斜杠符号\开头,用来说明后面的字符不是字符本身的含义,而是表示其它的含义。MySQL 中常见的转义字符如下表所示。

转义字符 转义后的字符
\" 双引号(")
\' 单引号(')
\\ 反斜线(\)
\n 换行符
\r 回车符
\t 制表符
\0 ASCII 0(NUL)
\b 退格符

转义字符区分大小写,例如:'\b' 解释为退格,但 '\B' 解释为 'B'。

有以下几点需要注意:

  • 字符串的内容包含单引号'时,可以用单引号'或反斜杠\来转义。
  • 字符串的内容包含双引号"时,可以用双引号"或反斜杠\来转义。
  • 一个字符串用双引号"引用时,该字符串中的单引号 '不需要特殊对待,且不必被重复转义。同理,一个字符串用单引号'引用时,该字符串中的双引号"不需要特殊对待,且不必被重复转义。

下面通过 SELECT 语句演示单引号' 双引号" 和反斜杠\的使用:

mysql> SELECT "数据分析", "'数据分析'", "数据""分析", "\"数据分析";
+-------------------+--------------------+----------------------+-------------------+-------------------+
| 数据分析     | '数据分析'   | 数据"分析     | "数据分析     |
+-------------------+--------------------+----------------------+-------------------+----
1 row in set (0.10 sec)

mysql> SELECT '数据分析', '""数据分析""','数据''分析',  '\'数据分析';
+------------------+--------------------+----------------------+-------------------+-------------------+
| 数据分析     | "数据分析"   | 数据'分析     | '数据分析     |
+------------------+--------------------+----------------------+-------------------+-------------------+
1 row in set (0.00 sec)

mysql> SELECT "我\n喜欢\n数据分析";
+---------------------------+
| 我
喜欢
数据分析     |
+---------------------------+
1 row in set (0.00 sec)
如果你想要把二进制数据插入到一个 BLOB 列,下列字符必须使用反斜杠\转义:   
  • NUL:ASCII  0。可以使用“\0“表示。   
  • \:ASCII  92,反斜线。用“\\”表示。 
  • ' :ASCII  39,单引号。用“\'”表示。   
  • " :ASCII  34,双引号。用“\"”表示。

MySQL系统变量

        在 MySQL 数据库,变量分为系统变量和用户自定义变量。系统变量以 @@ 开头,用户自定义变量以 @ 开头。服务器维护着两种系统变量,即全局变量(GLOBAL VARIABLES)和会话变量(SESSION VARIABLES)。全局变量影响 MySQL 服务的整体运行方式,会话变量影响具体客户端连接的操作。

        每一个客户端成功连接服务器后,都会产生与之对应的会话。会话期间,MySQL 服务实例会在服务器内存中生成与该会话对应的会话变量,这些会话变量的初始值是全局变量值的拷贝。

查看系统变量

        可以使用以下命令查看 MySQL 中所有的全局变量信息。

SHOW GLOBAL VARIABLES; 

        可以使用以下命令查看与当前会话相关的所有会话变量以及全局变量。

SHOW SESSION VARIABLES;

其中,SESSION 关键字可以省略。

        MySQL 中的系统变量以两个“@”开头。

  • @@global 仅仅用于标记全局变量;
  • @@session 仅仅用于标记会话变量;
  • @@ 首先标记会话变量,如果会话变量不存在,则标记全局变量。

        MySQL 中有一些系统变量仅仅是全局变量,例如 innodb_data_file_path,可以使用以下 3 种方法查看:

SHOW GLOBAL VARIABLES LIKE 'innodb_data_file_path';
SHOW SESSION VARIABLES LIKE 'innodb_data_file_path';
SHOW VARIABLES LIKE 'innodb_data_file_path';

        MySQL 中有一些系统变量仅仅是会话变量,例如 MySQL 连接 ID 会话变量 pseudo_thread_id,可以使用以下 2 种方法查看。

SHOW SESSION VARIABLES LIKE 'pseudo_thread_id';
SHOW VARIABLES LIKE 'pseudo_thread_id';

        MySQL 中有一些系统变量既是全局变量,又是会话变量,例如系统变量 character_set_client 既是全局变量,又是会话变量。

SHOW SESSION VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_client';

        此时查看全局变量的方法如下:

SHOW GLOBAL VARIABLES LIKE 'character_set_client';

设置系统变量

        可以通过以下方法设置系统变量:

  1. 修改 MySQL 源代码,然后对 MySQL 源代码重新编译(该方法适用于 MySQL 高级用户,这里不做阐述)。
  2. 在 MySQL 配置文件(mysql.ini 或 mysql.cnf)中修改 MySQL 系统变量的值(需要重启 MySQL 服务才会生效)。
  3. 在 MySQL 服务运行期间,使用 SET 命令重新设置系统变量的值。

        服务器启动时,会将所有的全局变量赋予默认值。这些默认值可以在选项文件中或在命令行中对执行的选项进行更改。

        更改全局变量,必须具有 SUPER 权限。设置全局变量的值的方法如下:

  • SET @@global.innodb_file_per_table=default;
  • SET @@global.innodb_file_per_table=ON;
  • SET global innodb_file_per_table=ON;

       更改全局变量只影响更改后连接客户端的相应会话变量,而不会影响目前已经连接的客户端的会话变量(即使客户端执行 SET GLOBAL 语句也不影响)。也就是说,对于修改全局变量之前连接的客户端只有在客户端重新连接后,才会影响到客户端。

        客户端连接时,当前全局变量的值会对客户端的会话变量进行相应初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。设置会话变量的值的方法如下:

  • SET @@session.pseudo_thread_id=5;
  • SET session pseudo_thread_id=5;
  • SET @@pseudo_thread_id=5;
  • SET pseudo_thread_id = 5;

        如果没有指定修改全局变量还是会话变量,服务器会当作会话变量来处理。比如:

SET @@sort_buffer_size = 50000;

上面语句没有指定是 GLOBAL 还是 SESSION,服务器会当做 SESSION 处理。

        使用 SET 设置全局变量或会话变量成功后,如果 MySQL 服务重启,数据库的配置就又会重新初始化。一切按照配置文件进行初始化,全局变量和会话变量的配置都会失效。

        MySQL 中还有一些特殊的全局变量,如 log_bin、tmpdir、version、datadir,在 MySQL 服务实例运行期间它们的值不能动态修改,也就是不能使用 SET 命令进行重新设置,这种变量称为静态变量。数据库管理员可以使用前面提到的修改源代码或更改配置文件来重新设置静态变量的值。

你可能感兴趣的:(mysql,数据库,数据分析)