日期:2014-05-16  浏览次数:20771 次

mysql 使用入门(1)

一个命令不必全在一个单独行给出,所以需要多行的较长命令不是一个问题。mysql通过寻找终止的分号而不是寻找输入行的结束来决定你的语句在哪儿结束。(换句话说,mysql接受自由格式输入:它收集输入行但执行他们直到它看见分号。)

这里是一个简单的多行语句的例子:

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

在这个例子中,在你输入一个多行查询的第一行后,要注意提示符如何从mysql>变为->,这正是mysql如何指出它没见到完整的语句并且正在等待剩余的部分。提示符是你的朋友,因为它提供有价值的反馈,如果你使用该反馈,你将总是知道mysql正在等待什么。

如果你决定,你不想要执行你在输入过程中输入的一个命令,打入\c取消它:

mysql> SELECT
    -> USER()
    -> \c
mysql>

这里也要注意提示符,在你打入\c以后,它切换回到mysql>,提供反馈以表明mysql准备接受一个新命令。

下表显示出你可以看见的各个提示符并总结他们意味着mysql在什么状态下:

提示符 意思
mysql> 准备好接受新命令
-> 等待多行命令的下一行
'> 等待下一行,收集以单引号(“'”)开始的字符串
"> 等待下一行,收集以双引号(“"”)开始的字符串

?

?

18.9 怎样重新设置一个忘记的口令

如果你忘记了MySQLroot用户的口令,你可以用下列过程恢复它。

  1. 通过发送一个kill(不是kill -9)到mysqld服务器来关闭mysqld服务器。pid 被保存在一个.pid文件中,通常在MySQL数据库目录中:
    kill `cat /mysql-data-directory/hostname.pid`
    

    你必须是一个UNIX root用户或运行服务器的相同用户做这个。

  2. 使用--skip-grant-tables选项重启mysqld
  3. mysql -h hostname mysql连接mysqld服务器并且用一条GRANT命令改变口令。见7.26 GRANTREVOKE句法。你也可以用mysqladmin -h hostname -u user password 'new password' 进行。
  4. mysqladmin -h hostname flush-privileges或用SQL命令FLUSH PRIVILEGES来装载权限表。?

18.12 使用DATE列的问题

一个DATE值的格式是'YYYY-MM-DD'。根据ANSI SQL,不允许其他格式。你应该在UPDATE表达式和SELECT语句的WHERE子句中使用这个格式。例如:

mysql> SELECT * FROM tbl_name WHERE date >= '1997-05-05';

为了方便,如果日期用在数字上下文,MySQL自动变换一个日期到一个数字(并且反过来也如此)。当更新时和将一个日期与TIMESTAMPDATEDATETIME列比较的一个WHERE子句中,也是足够灵活以允许一种“宽松”的字符串格式。(宽松格式意味着任何标点字符用作在部件之间的分割符。例如,'1998-08-15''1998#08#15'是等价的。)MySQL也能变换不包含分割符的一个字符串(例如 '19980815'),如果它作为一个日期说得通。

特殊日期'0000-00-00'可以作为'0000-00-00'被存储和检索当通过MyODBC使用一个'0000-00-00'日期时,在MyODBC 2.50.12和以上版本,它将自动被转换为NULL,因为ODBC不能处理这种日期。

因为MySQL实行了上述的变换,下列语句可以工作:

mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');

mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT mod(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

然而,下列将不工作:

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'19970505')=0;

STRCMP()是字符串函数,因此它将idate转换为一个字符串并且实施字符串比较。它不将'19970505'转换为一个日期并实施日期比较。

注意,MySQL不检查日期是否正确。如果你存储一个不正确的日期,例如'1998-2-31'