MySQL往期文章
mysql1> 安装与管理,安装,管理

| mysql2> PHP语法,mysql连接

| mysql3> 创建数据库,删除数据库,选择数据库

| mysq7> 元数据,序列使用,处理重复数据,及SQL注入,导出数据,导入数据

| | mysql4> 数据类型,创建数据表,删除数据表,插入数据,查询数据

| mysql5> where子句,UPDATE查询,DELETE语句,LIKE子句,排序,Join的使用

| mysql6> Null值处理,正则表达式,事务,ALTER命令,索引,临时表,复制表

| |

MySQL 数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

数值类型

MySQL支持所有标准SQL数值数据类型。 这些类型包括严格数值数据类型(**INTEGER****SMALLINT****DECIMAL****NUMERIC**),以及近似数值数据类型(**FLOAT****REAL****DOUBLE PRECISION**)。 关键字**INT****INTEGER**的同义词,关键字**DEC****DECIMAL**的同义词。 **BIT**数据类型保存位字段值,并且支持**MyISAM****MEMORY****InnoDB****BDB**表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINTMEDIUMINTBIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

日期和时间类型

表示时间值的日期和时间类型为DATETIMEDATETIMESTAMPTIMEYEAR
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 (字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型

字符串类型指CHARVARCHARBINARYVARBINARYBLOBTEXTENUMSET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-255字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHARVARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARYVARBINARY类类似于CHARVARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4BLOB类型:TINYBLOBBLOBMEDIUMBLOBLONGBLOB。它们只是可容纳值的最大长度不同。
4TEXT类型:TINYTEXTTEXTMEDIUMTEXTLONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

MySQL 创建数据表

创建MySQL数据表需要以下信息:

  • 表名
  • 表字段名
  • 定义每个表字段

    语法

    以下为创建MySQL数据表的SQL通用语法:

    1. CREATE TABLE table_name (column_name column_type);

    以下例子中我们将在 TUTORIALS 数据库中创建数据表tutorials_tbl

    1. tutorials_tbl(
    2. tutorial_id INT NOT NULL AUTO_INCREMENT,
    3. tutorial_title VARCHAR(100) NOT NULL,
    4. tutorial_author VARCHAR(40) NOT NULL,
    5. submission_date DATE,
    6. PRIMARY KEY ( tutorial_id )
    7. );

    实例解析:

  • 如果你不想字段为 **NULL** 可以设置字段的属性为 **NOT NULL**, 在操作数据库时如果输入该字段的数据为**NULL**,就会报错。

  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。

    通过命令提示符创建表

    通过 mysql> 命令窗口可以很简单的创建MySQL数据表。你可以使用 SQL 语句**CREATE TABLE**来创建数据表。

    实例

    以下为创建数据表 tutorials_tbl 实例:
    1. root@host# mysql -u root -p
    2. Enter password:*******
    3. mysql> use TUTORIALS;
    4. Database changed
    5. mysql> CREATE TABLE tutorials_tbl(
    6. -> tutorial_id INT NOT NULL AUTO_INCREMENT,
    7. -> tutorial_title VARCHAR(100) NOT NULL,
    8. -> tutorial_author VARCHAR(40) NOT NULL,
    9. -> submission_date DATE,
    10. -> PRIMARY KEY ( tutorial_id )
    11. -> );
    12. Query OK, 0 rows affected (0.16 sec)
    13. mysql>
    注意:MySQL命令终止符为分号(;)

    使用PHP脚本创建数据表

    你可以使用PHP的mysql_query() 函数来创建已存在数据库的数据表。
    该函数有两个参数,在执行成功时返回 TRUE,否则返回 FALSE

    语法

    1. bool mysql_query( sql, connection );
    | 参数 | 描述 | | —- | —- | | sql | 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。 | | connection | 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。 |

实例

以下实例使用了PHP脚本来创建数据表:

  1. <html>
  2. <head>
  3. <title>Creating MySQL Tables</title>
  4. </head>
  5. <body>
  6. <?php
  7. $dbhost = 'localhost:3036';
  8. $dbuser = 'root';
  9. $dbpass = 'rootpassword';
  10. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  11. if(! $conn )
  12. {
  13. die('Could not connect: ' . mysql_error());
  14. }
  15. echo 'Connected successfully<br />';
  16. $sql = "CREATE TABLE tutorials_tbl( ".
  17. "tutorial_id INT NOT NULL AUTO_INCREMENT, ".
  18. "tutorial_title VARCHAR(100) NOT NULL, ".
  19. "tutorial_author VARCHAR(40) NOT NULL, ".
  20. "submission_date DATE, ".
  21. "PRIMARY KEY ( tutorial_id )); ";
  22. mysql_select_db( 'TUTORIALS' );
  23. $retval = mysql_query( $sql, $conn );
  24. if(! $retval )
  25. {
  26. die('Could not create table: ' . mysql_error());
  27. }
  28. echo "Table created successfully\n";
  29. mysql_close($conn);
  30. ?>
  31. </body>
  32. </html>

MySQL 删除数据表

MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。

语法

以下为删除MySQL数据表的通用语法:

  1. DROP TABLE table_name ;

在命令提示窗口中删除数据表

在mysql>命令提示窗口中删除数据表SQL语句为**DROP TABLE**

实例

以下实例删除了数据表tutorials_tbl:

  1. root@host# mysql -u root -p
  2. Enter password:*******
  3. mysql> use TUTORIALS;
  4. Database changed
  5. mysql> DROP TABLE tutorials_tbl
  6. Query OK, 0 rows affected (0.8 sec)
  7. mysql>

使用PHP脚本删除数据表

PHP使用 mysql_query 函数来删除 MySQL 数据表。
该函数有两个参数,在执行成功时返回 TRUE,否则返回 FALSE

语法

  1. bool mysql_query( sql, connection );
参数 描述
sql 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。

实例

以下实例使用了PHP脚本删除数据表tutorials_tbl:

  1. <html>
  2. <head>
  3. <title>Creating MySQL Tables</title>
  4. </head>
  5. <body>
  6. <?php
  7. $dbhost = 'localhost:3036';
  8. $dbuser = 'root';
  9. $dbpass = 'rootpassword';
  10. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  11. if(! $conn )
  12. {
  13. die('Could not connect: ' . mysql_error());
  14. }
  15. echo 'Connected successfully<br />';
  16. $sql = "DROP TABLE tutorials_tbl";
  17. mysql_select_db( 'TUTORIALS' );
  18. $retval = mysql_query( $sql, $conn );
  19. if(! $retval )
  20. {
  21. die('Could not delete table: ' . mysql_error());
  22. }
  23. echo "Table deleted successfully\n";
  24. mysql_close($conn);
  25. ?>
  26. </body>
  27. </html>

MySQL 插入数据

MySQL 表中使用**INSERT INTO** SQL语句来插入数据。
你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。

语法

以下为向MySQL数据表插入数据通用的 **INSERT INTO** SQL语法:

  1. INSERT INTO table_name ( field1, field2,...fieldN )
  2. VALUES
  3. ( value1, value2,...valueN );

如果数据是字符型,必须使用单引号或者双引号,如:”value”。

通过命令提示窗口插入数据

以下我们将使用 SQL **INSERT INTO**语句向 MySQL 数据表 tutorials_tbl插入数据

实例

以下实例中我们将想 tutorials_tbl 表插入三条数据:

  1. root@host# mysql -u root -p password;
  2. Enter password:*******
  3. mysql> use TUTORIALS;
  4. Database changed
  5. mysql> INSERT INTO tutorials_tbl
  6. ->(tutorial_title, tutorial_author, submission_date)
  7. ->VALUES
  8. ->("Learn PHP", "John Poul", NOW());
  9. Query OK, 1 row affected (0.01 sec)
  10. mysql> INSERT INTO tutorials_tbl
  11. ->(tutorial_title, tutorial_author, submission_date)
  12. ->VALUES
  13. ->("Learn MySQL", "Abdul S", NOW());
  14. Query OK, 1 row affected (0.01 sec)
  15. mysql> INSERT INTO tutorials_tbl
  16. ->(tutorial_title, tutorial_author, submission_date)
  17. ->VALUES
  18. ->("JAVA Tutorial", "Sanjay", '2007-05-06');
  19. Query OK, 1 row affected (0.01 sec)
  20. mysql>

注意: 使用箭头标记(->)不是SQL语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号(;)
在以上实例中,我们并没有提供tutorial_id的数据,因为该字段我们在创建表的时候已经设置它为 AUTO_INCREMENT(自动增加) 属性。
所以,该字段会自动递增而不需要我们去设置。实例中 NOW()是一个 MySQL 函数,该函数返回日期和时间。

使用PHP脚本插入数据

你可以使用PHP 的 mysql_query()函数来执行 **SQL INSERT INTO**命令来插入数据。
该函数有两个参数,在执行成功时返回TRUE,否则返回FALSE

语法

  1. bool mysql_query( sql, connection );
参数 描述
sql 必需。规定要发送的 SQL 查询。注释:查询字符串不应以分号结束。
connection 可选。规定 SQL 连接标识符。如果未规定,则使用上一个打开的连接。

实例

以下实例中程序接收用户输入的三个字段数据,并插入数据表中:

  1. <html>
  2. <head>
  3. <title>Add New Record in MySQL Database</title>
  4. </head>
  5. <body>
  6. <?php
  7. if(isset($_POST['add']))
  8. {
  9. $dbhost = 'localhost:3036';
  10. $dbuser = 'root';
  11. $dbpass = 'rootpassword';
  12. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  13. if(! $conn )
  14. {
  15. die('Could not connect: ' . mysql_error());
  16. }
  17. if(! get_magic_quotes_gpc() )
  18. {
  19. $tutorial_title = addslashes ($_POST['tutorial_title']);
  20. $tutorial_author = addslashes ($_POST['tutorial_author']);
  21. }
  22. else
  23. {
  24. $tutorial_title = $_POST['tutorial_title'];
  25. $tutorial_author = $_POST['tutorial_author'];
  26. }
  27. $submission_date = $_POST['submission_date'];
  28. $sql = "INSERT INTO tutorials_tbl ".
  29. "(tutorial_title,tutorial_author, submission_date) ".
  30. "VALUES ".
  31. "('$tutorial_title','$tutorial_author','$submission_date')";
  32. mysql_select_db('TUTORIALS');
  33. $retval = mysql_query( $sql, $conn );
  34. if(! $retval )
  35. {
  36. die('Could not enter data: ' . mysql_error());
  37. }
  38. echo "Entered data successfully\n";
  39. mysql_close($conn);
  40. }
  41. else
  42. {
  43. ?>
  44. <form method="post" action="<?php $_PHP_SELF ?>">
  45. <table width="600" border="0" cellspacing="1" cellpadding="2">
  46. <tr>
  47. <td width="250">Tutorial Title</td>
  48. <td>
  49. <input name="tutorial_title" type="text" id="tutorial_title">
  50. </td>
  51. </tr>
  52. <tr>
  53. <td width="250">Tutorial Author</td>
  54. <td>
  55. <input name="tutorial_author" type="text" id="tutorial_author">
  56. </td>
  57. </tr>
  58. <tr>
  59. <td width="250">Submission Date [ yyyy-mm-dd ]</td>
  60. <td>
  61. <input name="submission_date" type="text" id="submission_date">
  62. </td>
  63. </tr>
  64. <tr>
  65. <td width="250"> </td>
  66. <td> </td>
  67. </tr>
  68. <tr>
  69. <td width="250"> </td>
  70. <td>
  71. <input name="add" type="submit" id="add" value="Add Tutorial">
  72. </td>
  73. </tr>
  74. </table>
  75. </form>
  76. <?php
  77. }
  78. ?>
  79. </body>
  80. </html>

在我们接收用户提交的数据时,为了数据的安全性我们需要使用get_magic_quotes_gpc()函数来判断特殊字符的转义是否已经开启。如果这个选项为off(未开启),返回0,那么我们就必须调用addslashes 这个函数来为字符串增加转义。

你也可以添加其他检查数据的方法,比如邮箱格式验证,电话号码验证,是否为整数验证等。

MySQL 查询数据

MySQL 数据库使用SQL SELECT语句来查询数据。
你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。

语法

以下为在MySQL数据库中查询数据通用的 SELECT 语法:

  1. SELECT field1, field2,...fieldN table_name1, table_name2...
  2. [WHERE Clause]
  3. [OFFSET M ][LIMIT N]
  • 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
  • SELECT命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用WHERE 语句来包含任何条件。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0
  • 你可以使用LIMIT属性来设定返回的记录数。

    通过命令提示符获取数据

    以下实例我们将通过 SQL SELECT 命令来获取 MySQL 数据表tutorials_tbl的数据:

    实例

    以下实例将返回数据表tutorials_tbl的所有记录: ```c root@host# mysql -u root -p password; Enter password:* mysql> use TUTORIALS; Database changed mysql> SELECT * from tutorials_tbl +——————-+————————+————————-+————————-+ | tutorial_id | tutorial_title | tutorial_author | submission_date | +——————-+————————+————————-+————————-+ | 1 | Learn PHP | John Poul | 2007-05-21 | | 2 | Learn MySQL | Abdul S | 2007-05-21 | | 3 | JAVA Tutorial | Sanjay | 2007-05-21 | +——————-+————————+————————-+————————-+ 3 rows in set (0.01 sec)

mysql>

  1. <a name="AFRPN"></a>
  2. ## 使用PHP脚本来获取数据
  3. 使用PHP函数的`mysql_query()`及`SQL SELECT`命令来获取数据。<br />该函数用于执行SQL命令,然后通过 PHP 函数 `mysql_fetch_array() `来使用或输出所有查询的数据。<br />`mysql_fetch_array() `函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有 返回根据从结果集取得的行生成的数组,如果没有更多行则返回` false`。<br />以下实例为从数据表` tutorials_tbl `中读取所有记录。
  4. <a name="Ibo7l"></a>
  5. ### 实例
  6. 尝试以下实例来显示数据表 tutorials_tbl 的所有记录。
  7. ```c
  8. <?php
  9. $dbhost = 'localhost:3036';
  10. $dbuser = 'root';
  11. $dbpass = 'rootpassword';
  12. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  13. if(! $conn )
  14. {
  15. die('Could not connect: ' . mysql_error());
  16. }
  17. $sql = 'SELECT tutorial_id, tutorial_title,
  18. tutorial_author, submission_date
  19. FROM tutorials_tbl';
  20. mysql_select_db('TUTORIALS');
  21. $retval = mysql_query( $sql, $conn );
  22. if(! $retval )
  23. {
  24. die('Could not get data: ' . mysql_error());
  25. }
  26. while($row = mysql_fetch_array($retval, MYSQL_ASSOC))
  27. {
  28. echo "Tutorial ID :{$row['tutorial_id']} <br> ".
  29. "Title: {$row['tutorial_title']} <br> ".
  30. "Author: {$row['tutorial_author']} <br> ".
  31. "Submission Date : {$row['submission_date']} <br> ".
  32. "--------------------------------<br>";
  33. }
  34. echo "Fetched data successfully\n";
  35. mysql_close($conn);
  36. ?>

以上实例中,读取的每行记录赋值给变量$row,然后再打印出每个值。
注意:记住如果你需要在字符串中使用变量,请将变量置于花括号。
在上面的例子中,PHP mysql_fetch_array()函数第二个参数为MYSQL_ASSOC, 设置该参数查询结果返回关联数组,你可以使用字段名称来作为数组的索引。
PHP提供了另外一个函数mysql_fetch_assoc(), 该函数从结果集中取得一行作为关联数组。
返回根据从结果集取得的行生成的关联数组,如果没有更多行,则返回false

实例

尝试以下实例,该实例使用了mysql_fetch_assoc()函数来输出数据表tutorial_tbl的所有记录:

  1. <?php
  2. $dbhost = 'localhost:3036';
  3. $dbuser = 'root';
  4. $dbpass = 'rootpassword';
  5. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  6. if(! $conn )
  7. {
  8. die('Could not connect: ' . mysql_error());
  9. }
  10. $sql = 'SELECT tutorial_id, tutorial_title,
  11. tutorial_author, submission_date
  12. FROM tutorials_tbl';
  13. mysql_select_db('TUTORIALS');
  14. $retval = mysql_query( $sql, $conn );
  15. if(! $retval )
  16. {
  17. die('Could not get data: ' . mysql_error());
  18. }
  19. while($row = mysql_fetch_assoc($retval))
  20. {
  21. echo "Tutorial ID :{$row['tutorial_id']} <br> ".
  22. "Title: {$row['tutorial_title']} <br> ".
  23. "Author: {$row['tutorial_author']} <br> ".
  24. "Submission Date : {$row['submission_date']} <br> ".
  25. "--------------------------------<br>";
  26. }
  27. echo "Fetched data successfully\n";
  28. mysql_close($conn);
  29. ?>

你也可以使用常量MYSQL_NUM 作为PHP mysql_fetch_array()函数的第二个参数,返回数字数组。

实例

以下实例使用MYSQL_NUM参数显示数据表tutorials_tbl的所有记录:

  1. <?php
  2. $dbhost = 'localhost:3036';
  3. $dbuser = 'root';
  4. $dbpass = 'rootpassword';
  5. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  6. if(! $conn )
  7. {
  8. die('Could not connect: ' . mysql_error());
  9. }
  10. $sql = 'SELECT tutorial_id, tutorial_title,
  11. tutorial_author, submission_date
  12. FROM tutorials_tbl';
  13. mysql_select_db('TUTORIALS');
  14. $retval = mysql_query( $sql, $conn );
  15. if(! $retval )
  16. {
  17. die('Could not get data: ' . mysql_error());
  18. }
  19. while($row = mysql_fetch_array($retval, MYSQL_NUM))
  20. {
  21. echo "Tutorial ID :{$row[0]} <br> ".
  22. "Title: {$row[1]} <br> ".
  23. "Author: {$row[2]} <br> ".
  24. "Submission Date : {$row[3]} <br> ".
  25. "--------------------------------<br>";
  26. }
  27. echo "Fetched data successfully\n";
  28. mysql_close($conn);
  29. ?>

以上三个实例输出结果都一样。

内存释放

在我们执行完SELECT语句后,释放游标内存是一个很好的习惯。
可以通过PHP函数mysql_free_result()来实现内存的释放。
以下实例演示了该函数的使用方法。

实例

尝试以下实例:

  1. <?php
  2. $dbhost = 'localhost:3036';
  3. $dbuser = 'root';
  4. $dbpass = 'rootpassword';
  5. $conn = mysql_connect($dbhost, $dbuser, $dbpass);
  6. if(! $conn )
  7. {
  8. die('Could not connect: ' . mysql_error());
  9. }
  10. $sql = 'SELECT tutorial_id, tutorial_title,
  11. tutorial_author, submission_date
  12. FROM tutorials_tbl';
  13. mysql_select_db('TUTORIALS');
  14. $retval = mysql_query( $sql, $conn );
  15. if(! $retval )
  16. {
  17. die('Could not get data: ' . mysql_error());
  18. }
  19. while($row = mysql_fetch_array($retval, MYSQL_NUM))
  20. {
  21. echo "Tutorial ID :{$row[0]} <br> ".
  22. "Title: {$row[1]} <br> ".
  23. "Author: {$row[2]} <br> ".
  24. "Submission Date : {$row[3]} <br> ".
  25. "--------------------------------<br>";
  26. }
  27. mysql_free_result($retval);
  28. echo "Fetched data successfully\n";
  29. mysql_close($conn);
  30. ?>