PHP L4 MySQL语言结构:字符串和数字


本课概要:

1.MySQL字符串和数字

字符串是多个字符组成的一个字符序列,由单引号(“’”) 或双引号 (“””) 字符包围。(但在 ANSI 模式中运行时只能用单引号)。

例如:’a string’ “another string” 在一个字符串中,如果某个序列具有特殊的含义,每个序列以反斜线符号 (“”)开头,称为转义字符

MySQL 识别下列转义字符:

一个 ASCII 0 (NUL) 字符。

‘ 一个 ASCII 39 单引号 (“’”) 字符。

” 一个 ASCII 34 双引号 (“””) 字符。

b 一个 ASCII 8 退格符。

n 一个 ASCII 10 换行符。

r 一个 ASCII 13 回车符。

t 一个 ASCII 9 制表符(TAB)。

z ASCII(26) (Control-Z)。这个字符可以处理在 Windows 系统中 ASCII(26) 代表一个文件的结束的问题。(当使用 mysql database < filename 时 ASCII(26) 可能会引起问题产生。)

一个 ASCII 92 反斜线 (“”) 字符。

% 一个 ASCII 37 “%” 字符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符。
一个 ASCII 95 “_” 字符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符。

MySQL字符串:

字符串中包含引号的可以有下列几种写法:

一个字符串用单引号“ ‘ ”来引用的,该字符串中的单引号“ ‘ ”字符可以用“ ” ”方式转义。

一个字符串用双引号“ ” ”来引用的,该字符串中的“ ” ”字符可以用“ “” ”方式转义。

你也可以继续使用在引号前加一个转义字符“”来转义的方式。

一个字符串用双引号“ ” ”来引用的,该字符串中的单引号“ ‘ ”不需要特殊对待而且不必被重复或转义。同理,一个字符串用单引号“ ‘ ”来引用的,该字符串中的双引号“ ” ”不需要特殊对待而且不必被重复或转义。

下面显示的 SELECT 演示引号和转义是如何工作:

mysql> SELECT ‘hello’, ‘”hello”‘, ‘””hello””‘, ‘hel”lo’, ”hello’;

+——-+———+———–+——–+——–+

| hello | “hello” | “”hello”” | hel’lo | ‘hello   |

+——-+———+———–+——–+——–+

mysql> SELECT “hello”, “‘hello'”, “”hello””, “hel””lo”, “”hello”;

+——-+———+———–+——–+——–+

| hello  | ‘hello‘  | ”hello’‘  | hel”lo  | “hello |

+——-+———+———–+——–+——–+

mysql> SELECT “hackbasenvipnmembernjeffrey”;  

+————-+

|hackbase |

|Vip           |

|Member   |

|jeffrey      |

+————+

MySQL数字:

  整数被表示为一个数字序列。浮点数使用 “.” 作为一个十进制的分隔符。这两种类型的数字可以前置 `-‘ 以表示一个负值。

有效整数的例子:

1221 0 -32

有效浮点数的例子:

294.42 -32032.6809e+10 148.00

一个整数可以在浮点语境中使用;它被解释为等值的浮点数。

mysql> select (59+62+58)/3;

2.MySQL数据标识符

数据库、表、索引、列和别名都需要遵守 MySQL 同样的规则。

===================================================

标识符   最大长度     允许的字符

————————————————————————————

数据库    64          允许任何字符,除了/ .

表        64          允许任何字符,除了/ .

列        64          所有的字符

别名      255         所有的字符

===================================================

注意,除了上面的,在一个标识符中还不能有 ASCII(0) 或 ASCII(255) 或引用字符。

注意,如果标识符是一个受限制的词或包含特殊的字符,当使用它时,必须以一个 ` (backtick) 来引用它。

 

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

 

保留字课程中讲它

 

在 MySQL 中,你可以使用下列表格中的任一种方式引用一个列:

 

列引用                                         含义

col_name                                   列 col_name 来自查询所用的任何一个表中对应字段

tbl_name.col_name                   列 col_name 来自当前数据库中的表 tbl_name db_name.tbl_name.col_name   列 col_name 来自数据库 db_name 中的表 tbl_name。

`column_name`                        该字段是一个关键词或包含特殊字符。

 

在一条语句中的列引用中,不需要明确指定一个 tbl_name 或 db_name.tbl_name 前缀,除非这个引用存在二义性。

例如,假设表 t1 和 t2 均包含一个字段 c,当用一个使用了 t1 和 t2 的 SELECT 检索 c 时。在这种情况下,c 存在二义性,因为它在这个语句所使用的表中不是唯一的,因而必须通过写出 t1.c 或 t2.c 来指明你所需的是哪个表。

同样的,如果从数据库 db1 的表 t 和数据库 db2 的表 t 中检索,你必须用db1.t.col_name 和 db2.t.col_name 来指定引用哪个库表的列。

句法 .tbl_name 意味着表 tbl_name 在当前数据库中。这个句法是为了与 ODBC 兼容,因为一些 ODBC 程序以一个 “.” 字符作为表名的前缀。

 

 3.MySQL名字的大小写敏感性

在 MySQL 中,数据库和表相对于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。

这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。

注意

尽管在 Windows 中数据库与表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。

下面的查询将不能工作,因为它以 my_table 和 MY_TABLE 引用一个表:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列名与列的别名在所有的情况下均是忽略大小写的。

表的别名是区分大小写的。下面的查询将不能工作,因为它用 a 和 A 引用别名:

mysql> SELECT col_name FROM tbl_name AS a -> WHERE a.col_name = 1 OR A.col_name = 2;

  如果记忆数据库和表名的字母大小写有困难,建议采用一个一致一约定,例如总是以小写字母创建数据库和表。

1.创建一个数据库

在MYSQL安装目录下,察看一下,有没有生成一个相应的数据库.

2.显示数据库列表

在MYSQL安装目录下,删除的数据库文件夹,在命令行查询,也提示成功了.

3.创建一张表

4.删除这张表

 

两种方式

数据库名和表名  <==>   MYSQL安装目录

之间的对应关系.来说明MYSQL大小写敏感性.

不管创建大写的数据库名字,还是小写的.在windows平台的MYSQL呢是不会区分的.

LINUX/UNIX区分这个问题.

 

  4.MySQL用户变量

MySQL 支持连接特定(connection-specific)的用户变量,用 @variablename 句法表示。一个变量名可以由当前字符集中包含的文字与数字字符以及 “_”、“$” 和 “.” 组成。缺少的字符集为 ISO-8859-1 Latin1;这可以通过改变 mysqld 的–default-character-set 的选项来改变。

变量不必被初始化。缺省地,他们的值为 NULL 并可以存储一个整数、实数或字符串值。当连接线程退出时,这个线程的所有变量将会自动地被释放。

直接为一个变量赋值

在语句中除了 SET 之外还可以直接为一个变量赋值。然而在这各情况下,赋值操作符为 := 而不是 =,因为 = 在非 SET 语句中是用于比较的:

mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;

+———————————-+——–+——+——+

| @t1:=(@t2:=1)+@t3:=4     | @t1   | @t2  | @t3  |

+———————————-+——–+——+——+

| 5                                         | 5        | 1      | 4     |

+———————————-+——–+——+——+

注意

在一个 SELECT 语句中,各个表达式只有在它被送到客户端时才能被求值。这就意味着,在 HAVING、GROUP BY 或 ORDER BY 子句中,你不能使用一个包含在 SELECT 部份所设置变量的表达式。例如:下面的语句将不会按预期的运作:

mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name

HAVING b=5; 是因为 @aa 不会是当前行的值,而是前一个符合条件的行的 id 值。

规则就是在同一语句中决不赋值 使用同一个变量。

 5.MySQL 系统变量

系统变量

从 MySQL 4.0.3 开始,我们提供了对大量的系统变量和连接变量的更好的访问方式。你可以不需要关闭服务器就可以更改其中的大部变量值。

系统变量可分为两种类型:线程特定(Thread-specific)或称为连接特定(connection-specific)变量,它们是当前连接唯一的;全局变量,它们用于设置全局事件。全局变量也同样被用于设置一个新连接的相应线程特定变量的初始值。

当 mysqld 启动时,所有的全局变量以命令行参数和选项文件内容初始化。可以通过 SET GLOBAL 命令更改这些值。当一个新的连接线程被建立时,将以全局变量值初始化线程特定变量,直到你执行一个新的 SET GLOBAL 命令时,线程特定变量才会改变。

设置一个 全局变量

SET GLOBAL sort_buffer_size=value;

SET @@global.sort_buffer_size=value;

在这里,我们以 sort_buffer_size 变量作为一个示例

SET SESSION sort_buffer_size=value;

SET @@session.sort_buffer_size=value;

SET sort_buffer_size=value;

默认变量的问题

如果你没有明确指定 GLOBAL 或 SESSION,那么默认地将是设置 SESSION。

检索一个全局(GLOBAL)变量值

通过下面的任一命令可以检索到一个全局(GLOBAL) 变量值:

SELECT @@global.sort_buffer_size;

SHOW GLOBAL VARIABLES like ‘sort_buffer_size’;

检索一个 会话(SESSION) 变量值

通过下面的任一命令可以检索到一个 会话(SESSION) 变量值:

SELECT @@session.sort_buffer_size; SHOW SESSION

VARIABLES like ‘sort_buffer_size’;

检索 一个变量值时使用 @@variable_name 句法,或没有指定 GLOBAL 或 SESSION 时,如果线程特定(thread-specific)的 (SESSION) 值存在,MySQL 将返回它。如果不存在,那么 MySQL 将返回全局变量值。

在设置 全局(GLOBAL) 变量而不是在检索他们的时候需要使用 GLOBAL ,是为了在之后引用一个同名的线程特定(thread-specific)变量或删除同名的一个线程特定(thread-specific)变量时不至发生问题。在这种情况下,你可能无意间改变整个服务器的状态而不是你自己的连接。

下面的列表是你可以使用 GLOBAL 或 SESSION 对它们进行更改和检索的所有变量。

以 num 标记的变量可以设置一个数字值。

以 bool 标记的变量可以设置 0、1、ON 或 OFF。

enum 类型的变量通常是设置为该变量的某一个可用值,但也可以设置为相对应的数字。(enum 的第一个值为 0)。

 

 6.MySQL 保留字—注释句法

  MySQL 服务器支持:# 到该行结束、– 到该行结束、/* 行中间或多个行 */ 的注释方格:

mysql> SELECT 1+1; # 这个注释直到该行结束

mysql> SELECT 1+1; — 这个注释直到该行结束

mysql> SELECT 1 /* 这是一个在行中间的注释 */ + 1;

mysql> SELECT 1+ /* 这是一个 多行注释的形式 */ 1;

注意 — (双长划) 注释风格要求在两个长划后至少有一个空格!

尽管服务器理解刚才描述的注释句法,但 MySQL 客户端的语法分析在 /* … */ 注释方式上还有所限止:

MySQL 对保留字挑剔吗?

一个常见的问题来于试图使用 MySQL 内置的数据类型或函数名作为表的字段名来创建数据表,例如 TIMESTAMP 或 GROUP。但是,允许你这样做(例如,ABS 是一个允许的列名),当使用函数名也是列名的函数时,函数名与后面跟着的 “(” 之间不允许存在空格。

 

 

发表评论