服务器 频道

Mysql 常见问题惠总

  【IT168 服务器学院】   哪里可以找到关于mysql和DBI的文档资料?
答:mysql可以到其官方主页http://www.mysql.com关于DBI可以到DBD/DBI主页
http://www.symbolstone.org/technology/perl/DBI
http://www.savebaseball.com/mysql也可以找到DBI和mysql的一些信息。已经安
装了DBI的系统可以在用perldoc DBI 或 man DBI 或 perldoc mysql 等命令查看信息。

    什么是DBI?
答:以下答案引自DBI的作者Tim Bunce:"DBI是用于Perl语言、操作数据库的应用程序
接口(API)。DBI API规范定义了一套函数(functions),变量和协定, 提供了一个稳定的
数据库接口而不必考虑实际使用什么样的数据库" 用更精炼的语言来描述就是,DBI作为
Perl语言的接口,允许使用者不需要更改程序就可以操作不同的数据库。

    哪里可以下载DBI?
答: http://www.perl.com/CPAN , http://www.nighthawk.com.cn

    什么是mysql?
答: mysql是一个真正多用户、多线程的SQL数据库服务器. SQL 是世界上最普及的数据
库语言. mysql是客户/服务端机制,即包括一个后端的服务器和许多不同的客户程序和库。
mysql数据库是众多的关系型数据库产品中的一个,相比较其它系统而言,mysql数据库
可以称得上是目前运行速度最快的SQL语言数据库。 除了具有许多其它数据库所不具备
的功能和选择之外,mysql数据库是一种完全免费的产品,用户可以直接从网上下载数
据库,用于个人或商业用途,而不必支付任何费用。

    mysql数据库具有以下主要特点:

a. 同时访问数据库的用户数量不受限制;
b. 可以保存超过50,000,000条记录;
c. 是目前市场上现有产品中运行速度最快的数据库系统;
d. 用户权限设置简单、有效。

    哪里可以下载mysql?
答: http://www.mysql.com

    如何知道我现在正用着的mysql的版本?
答: 登录mysql以后,用s命令可以看到许多关于mysql的信息.

   如何加入DBI邮件列表?
答: 要获得更多的信息和更新消息,你可以通过访问网址www.isc.org/dbi-lists.html
来加入DBI邮件列表(或者发一封电子邮件到dbi-users-request@isc.org).

   如何安装mysql
答:去http://www.mysql.com/download_win.html,下载mysql-Win32发行版, 将zip文
件解压到一个临时目录并且运行安装程序setup.exe,缺省的典型安装, 所有的mysql文
件将会安装到c:mysql目录下。  

启动mysql的方法是运行c:mysqlbinmysqld-shareware.exe,你可以看到一个dos窗口,
并在几秒钟后关闭。如果没有显示错误信息,mysql就已经运行了。

    如何安装DBI模块?
答:安装dbi之前,请先安装activeperl(http://www.activestate.com 处可下载)

1)在线安装
连接上Internet,开一DOS窗口,在提示符下键入:PPM

PPM> help (可以得到帮助信息)
PPM> query DBI (可以察看是否已经安装了DBI)
PPM> install DBI (自动下载并安装DBI,会列出所有安装的文件及路径

2)离线安装
www.nighthawk.com.cn处下载DBI.zip,解开到一个临时目录 然后,在dos下,键入命令:
ppm install dbi.ppd

   DBI要求什么版本的Perl?
答:Perl 5.004_04以上

    如何从一个字符串中过滤特别字符?
答: 用$dbh->quote()方法.

quote()方法可从字符串中提取特别字符(如:引号等),然后自动加上右边的引号. 但不
能处理所有的输入(如二进制数据).

#!/usr/local/bin use DBI;
# 连接SQL服务器 ....
# 从网页表单中取得字符信息.
my $string = $cgi_data{''user_input''};
$string = $dbh->quote($string);

# 因为quote已经加上了右边的引号,所以你不必在加上.
my $sql_q = "SELECT * FROM $table WHERE field = $string ";

   有没有可能在$sth中查出SQL语句的类型?
答:可试下这个:
if ($sql_statement =~ /^s*(insert|update|delete)/i) { # do something }
elsif ($sql_statement =~ /^s*select/i) { # do something }
else { # do something }

   如何加密一个密码,并将来和输入密码向相比较?
答: 保存一个密码(即从网页上输入的),首先要对密码加密然后再把它保存在数据库中。
mysql已经有一个加密函数来对一个字符串加密.

# 连接sql server
# 从表单中取得user id 和 password
# 你可能要通过$dbh->quote()函数来确定输入中没有会破坏SQL语句的字符

my $insert_user = "INSERT INTO $user_table (user_id,password)
VALUES(''$user_id'',PASSWORD(''$password'')";
my $insert_sth = $dbh->prepare($insert_user);
$insert_sth->execute() or die "Error : $dbh->errstr";

# 检查用户是否输入了正确的字符
# 注意 : 又必须先运行dbh->quote()

my $check_sql = "SELECT * FROM $user_table WHERE
user_id = $user_id AND passwordfield = PASSWORD(''$password_entered'')";

如果你不想用mysql的PASSWORD函数, 你可以在保存前用perl的crypt 函数来加密。 进
行比较时,先对输入密码crypt,然后与保存在数据库中的已加密密码进行比较。

    如何在mysql中创建表 ?
答:试下这个 ..
CREATE TABLE pictures( picture_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
category_id SMALLINT UNSIGNED NOT NULL,
location VARCHAR(40),
thumb VARCHAR(40),
title VARCHAR(80) NOT NULL,
description TINYTEXT,
last_modified DATE,
last_viwed DATE,
view_count INT UNSIGNED,
user_id VARCHAR(20) NOT NULL,
colour ENUM(''true'',''false'') NOT NULL DEFAULT ''true'',
PRIMARY KEY (picture_id),
INDEX (title),
INDEX (user_id),
INDEX (category_id),
INDEX (colour) );

   如何在M个纪录中只列出N个,并用翻页的方法列出其它?
答:可以采用mysql的LIMIT函数.

注意:下面的代码用了cgi-lib.pl的函数来获取网页输入数据.
sub List_Result{
my ($user_action) = @_;
my %cgi_data;
&ReadParse(%cgi_data);
my $limit = 10 ;
my $offset = $cgi_data{''offset''};
my $printed = $cgi_data{''printed''};
my $prev_offset = $cgi_data{''prev_offset''};
my $next_action = $cgi_data{''next_action''};
my $print_cnt = 0;
$new_prev_offset = $offset;
#下面的代码取得用户的操作
if ($next_action eq "Next"){
$offset += $limit;
}
elsif($next_action eq "Previous"){
if ($printed < $limit){
$offset = $prev_offset;
}else{
$offset -= $printed;
}
}
else { $offset = 0 ; }
}

my $SELECT ;
my $LIMIT = " LIMIT $offset,$limit";

# 如果$KEEP_SQL 为空,则表示重新开始,用旧的sql语句
if ($KEEP_SQL eq ""){
if($user_action eq "list_all"){
$SELECT = "SELECT * FROM mytable ";
}
else{
$SELECT = "SELECT * FROM mytable WHERE rec_id = $rec_id ";
}
}else{
$SELECT = $KEEP_SQL;
}

my $SQL = $SELECT.$LIMIT;

# KEEP_SQL将被保存在一个隐含的表段输入中,这个变量保证每次都用一个sql语句.
my $KEEP_SQL = $SELECT;
my $sth = $dbh->prepare($SQL);
$sth->execute() or die "Can''t execute:";

# 做你想做的事情.
print " [form method=post action=$this_cgi] ...
... 列出结果 ..
[input type=hidden name=offset value=$offset]
[input type=hidden name=printed value=$printed]
[input type=hidden name=prev_offset value=$new_prev_offset]
[input type=hidden name=user_action value=viewing_result]
[input type=hidden name=KEEP_SQL value=$KEEP_SQL] ";

if ($offset > 0 ) {print "[input type=submit name=next_action width=100 value="Previous"]n"; }
if ($printed == $limit){ print "[input type=submit name=next_action width=100 value="Previous"n"]; }
print "[/form]";

0
相关文章