首页 > php与数据库

如何修护MYSQL数据表

如果数据表有问题,可以利用--recover --quick参数做修补的工作:
linux#myisamchk --recover --quick tbl_name
linux#isamchk --recover --quick tbl_name
如果上面的方法不能解决问题,可以将--quick参数去掉:
linux#myisamchk --recover tbl_name
linux#isamchk --recover tbl_name
如果还是不能解决问题,可以再试着改用--safe_recover参数:
linux#myisamchk --safe_recover --quick tbl_name
linux#isamchk --safe_recover --quick tbl_name

阅读全文

特殊数据(SQL)

特殊数据包括不能用前面所述的二进制、字符、Unicode、日期和时间、数字和货币数据类型表示的数据。
Microsoft® SQL Server™ 2000 包含四种特殊数据类型:
timestamp
用于表示 SQL Server 在一行上的活动顺序,按二进制格式以递增的数字来表示。当表中的行发生变动时,用从 @@DBTS 函数获得的当前数据库的时间戮值来更新时间戮。timestamp 数据与插入或修改数据的日期和时间无关。若要自动记录表中数据更改的时间,使用 datetime 或 smalldatetime 数据类型记录事件或触发器。
说明 在 SQL Serve 中 rowversion 是 timestamp 的同义词。
bit
bit 数据类型只能包括 0 或 1。可以用 bit 数据类型代表 TRUE 或 FALSE、YES 或 NO。例如,询问客户是否为初次访问的问题可存储在 bit 列中。
uniqueidentifier
以一个 16 位的十六进制数表示全局唯一标识符 (GUID)。当需要在多行中唯一标识某一行时可使用 GUID。例如,可使用 unique_ identifier 数据类型定义一个客户标识代码列,以编辑公司来自多个国家/地区的总的客户名录。
sql_variant
一种存储 SQL Server 所支持的各种数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型。
table
一种特殊的数据类型,存储供以后处理的结果集。table 数据类型只能用于定义 table 类型的局部变量或用户定义函数的返回值。
用户定义
允许使用用户定义数据类型,例如,product_code 可设计为基于 char 数据类型的两个大写字母后跟 5 位供应商号码的格式。

阅读全文

SELECT查询的应用

比如我们要从很多文章的标题中找到所有包含"MySQL"这个字眼的文章。这就应该在 WHERE 子句中用到 "LIKE",就是模糊查询。
 
  首先交待一下SQL语言中的统配符,统配符就是用一个字符统一匹配任何字符,SQL中,一个字符"_"匹配单个的任何字符;一个字符"%"匹配任何零个到多个字符。举例来说,"A_" 可以匹配诸如 "AA"、"AB"、"A2"、"A$"……等等;而 "A%" 可以匹配 "ABCD"、"A"、"AG$Bng0"、"An apple is just an apple."……等等。
 
  怎么用呢?还是举个实际的例子:工厂仓库里的东东,很多、很杂,要分成几大类来管理:比如A类代表机配件,B类代表工具,C类代表包装材料……等等,每一类下面的东东再分别编号,如"A0001"、"A1065"、"B1014"等。在管理这个数据库的时候,编号作为一个字段,这个字段不仅作为该物品的代号,同时也表明了它的类别。当你要查询所有的工具时,可以这样:
SELECT * FROM goods WHERE code LIKE 'B%' ORDER BY code'
这样就是查询code这个字段(就是编号)为字母B打头的所有记录。注意这里'B%'表示字母B是出现在字段的开头,与下一个例子不同:查找文章标题中含有"MySQL"这个字眼的所有文章,因为要查找的目标"MySQL"不一定出现在文章标题的什么位置上,所以应该:
SELECT * FROM articles WHERE title LIKE '%MySQL%'
'%MySQL%'的意思是"MySQL"这个字眼出现在标题中,它的前面可能有文字,后面也可能有文字。
 
  既然查"MySQL"可以,查别的字眼未尝不可以。可以让浏览者自己输入他要搜索的关键字,就是这样:
<!--input.php:-->
<form method="get" action="search.php">
关键字:<input type="text" size=10 name="key"> <input type="submit" value="查询">
</form>
<!--search.php:-->
<?
...
$query="select * from article where title like '%$key%'";
$result=$mysql_query($query,$db);
...
?>
  注意在使用模糊查询时,有一种情况应该小心,就是当一个字段是类似 '2,13,25,33' 这样的值时,若要查询它其中是否包含'2'这一项,就不能简单的用 '%2%' 来查询。因为如果这样,一个这样的值也会被查询到:'1,6,21,27'。这并不是我们所希望的。所以在处理这样的问题时,应该将该字段存为 '.2.13.25.33.' 的形式。这样当需要查询包含'2'这一项的记录,就可以放心的用 '%.2.%' 了。
 

  时间仓促,草草成稿;如有不确,务请指正。

阅读全文

MySQL的数据类型和建库策略

无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。
一、数字类型。数字类型按照我的分类方法分为三类:整数类、小数类和数字类。
我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们是同一种类型。它严格的说不是一种数字类型,因为他们实际上是将数字以字符串形式保存的;他的值的每一位(包括小数点)占一个字节的存储空间,因此这种类型耗费空间比较大。但是它的一个突出的优点是小数的位数固定,在运算中不会“失真”,所以比较适合用于“价格”、“金额”这样对精度要求不高但准确度要求非常高的字段。
小数类,即浮点数类型,根据精度的不同,有FLOAT(单精度)和DOUBLE(双精度)两种。它们的优势是精确度,FLOAT可以表示绝对值非常小、小到约 1.17E-38 (0.000...0117, 小数点后面有37个零)的小数,而DOUBLE更是可以表示绝对值小到约 2.22E-308 (0.000...0222, 小数点后面有307个零)的小数。FLOAT类型和DOUBLE类型占用存储空间分别是4字节和8字节。如果需要用到小数的字段,精度要求不高的,当然用FLOAT了!可是说句实在话,我们“民用”的数据,哪有要求精度那么高的呢?这两种类型至今我没有用过——我还没有遇到适合于使用它们的事例。
用的最多的,最值得精打细算的,是整数类型。从只占一个字节存储空间的TINYINT到占8个字节的BIGINT,挑选一个“够用”并且占用存储空间最小的类型是设计数据库时应该考虑的。TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT占用存储空间分别为1字节、2字节、3字节、4字节和8字节,就无符号的整数而言,这些类型能表示的最大整数分别为255、65535、16777215、4294967295和18446744073709551615。如果用来保存用户的年龄(举例来说,数据库中保存年龄是不可取的),用TINYINT就够了;九城的《纵横》里,各项技能值,用SMALLINT也够了;如果要用作一个肯定不会超过16000000行的表的AUTO_INCREMENT的IDENTIFY字段,当然用 MEDIUMINT 不用 INT ,试想,每行节约一个字节,16000000行可以节约10兆多呢!
二、日期时间类型。
日期和时间类型比较简单,无非是 DATE、TIME、DATETIME、TIMESTAMP和YEAR等几个类型。只对日期敏感,而对时间没有要求的字段,就用DATE而不用DATETIME是不用说的了;单独使用时间的情况也时有发生——使用TIME;但最多用到的还是用DATETIME。在日期时间类型上没有什么文章可做,这里就不再详述。

阅读全文

在英文NT及SQL下,实现页面中中文出现

问题:从数据库中读出的中文均为“?”
解决方案:
Step 1:注册 Code Page使SQL Server支持中文
1.复制文件C_936.nls到系统目录下的system32目录
2.使用Regedit32.exe增加以下键:
location: HKEY_LOCAL_MACHINEsystemCurrentControlSetControlNlsCode
Page
value name: 936
value: C_936.NLS
location: HKEY_LOCAL_MACHINEsystemCurrentControlSetControlNlsLang
uage
value name: 0804
value: l_intl.nls
3.使用简体中文字符集重建SQL server的Master数据库
Step 2.
在ASP程序的开头中加入一行:
<%@ codepage=936 %>
这个解决方案好处是不用安装中文平台系统,又可以稳定运行NT(英文企业版较
稳定)

阅读全文

MySQL怎样优化WHERE子句

where优化主要是在SELECT中,因为他们最主要是在那里使用,但是同样的优化也可被用于DELETE和UPDATE语句。
但请注意,下面的优化并不是完全的。MYSQL实施了许多优化,但我没时间全部测试.
MySQL的一些优化列在下面:
删除不必要的括号:
((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
常数调入:
(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
删除常数条件:
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
索引使用的常数表达式仅计算一次。
在一个单个表上的没有一个WHERE的COUNT(*)直接从表中检索信息。当仅使用一个表时,对任何NOT NULL表达式也这样做。
无效常数表达式的早期检测。MySQL快速检测某些SELECT语句是不可能的并且不返回行。
如果你不使用GROUP BY或分组函数(COUNT()、MIN()……),HAVING与WHERE合并。
为每个子联结(sub join),构造一个更简单的WHERE以得到一个更快的WHERE计算并且也尽快跳过记录。
所有常数的表在查询中的在其他任何表之前被读出。
一个常数的表是:
一个空表或一个有1行的表。
与在一个UNIQUE索引、或一个PRIMARY KEY的WHERE子句一起使用的表,这里所有的索引部分使用一个常数表达式并且索引部分被定义为NOT NULL。
所有下列的表用作常数表:
mysql> SELECT * FROM t WHERE primary_key=1;
mysql> SELECT * FROM t1,t2 WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
对联结表的最好联结组合是通过尝试所有可能性来找到:(。如果所有在ORDER BY和GROUP BY的列来自同一个表,那么当联结时,该表首先被选中。
如果你使用SQL_SMALL_RESULT,MySQL将使用一个在内存中的表。
如果有一个ORDER BY子句和一个不同的GROUP BY子句,或如果ORDER BY或GROUP BY包含不是来自联结队列中的第一个表的其他表的列,创建一个临时表。
因为DISTINCT被变换到在所有的列上的一个GROUP BY,DISTINCT与ORDER BY结合也将在许多情况下需要一张临时表。
每个表的索引被查询并且使用跨越少于30% 的行的索引。如果这样的索引没能找到,将使用一个快速的表扫描。
在一些情况下,MySQL能从索引中读出行,甚至不用查询数据文件。如果索引使用的所有列是数字的,那么只有索引树被用来解答查询。

阅读全文

使用特殊数据

特殊数据类型是指那些不适合其它数据类型分类的数据类型。例如,若要将客户调查中"是"或"否"的值相应地用 1 或 0 进行存储,则可使用 bit 数据类型。Microsoft&reg; SQL Server&#8482; 2000 在该分类中有几个数据类型:
bit
bit 数据不必放在单引号中。它是与 SQL Server 的整型和数字数据相似的数字数据,但 bit 列只能存储 0 和 1。
sql_variant
SQL Server 中的 sql_variant 数据类型允许单个列、参数或变量存储不同数据类型的数据值。sql_variant 列的每个实例都记录数据值和描述该值的元数据:该值的基本数据类型、最大大小、小数位数、精度和排序规则。
下例中的第二个表包含一个 sql_variant 列:
CREATE TABLE ObjectTable
(ObjectID int
CONSTRAINT PKObjectTable PRIMARY KEY,
ObjectName nvarchar(80),
ObjectWeight decimal(10,3),
ObjectColor nvarchar(20)
)
CREATE TABLE VariablePropertyTable
(ObjectID int REFERENCES ObjectTable(ObjectID),
PropertyName nvarchar(100),
PropertyValue sql_variant,
CONSTRAINT PKVariablePropertyTable
PRIMARY KEY(ObjectID, PropertyName)
)
若要获得任何一个特定 sql_variant 实例的元数据信息,请使用 SQL_VARIANT_PROPERTY 函数。
table
table 数据类型类似是一个临时表,可以用于存储一个结果集以便以后处理。这种数据类型只能用于定义 table 类型的局部变量和用户定义函数的返回值。
一个 table 变量或返回值的定义包括列、数据类型、精度、每列的小数位数以及可选的 PRIMARY KEY、UNIQUE 和CHECK 约束。
存储在 table 变量中或用户定义函数返回值中的行的格式,必须在声明变量或创建函数时定义。其语法基于 CREATE
TABLE 的语法。例如:
DECLARE @TableVar TABLE
(Cola int PRIMARY KEY,
Colb char(3))
INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')
SELECT * FROM @TableVar
GO
返回一个 table 的 table 变量和用户定义函数只能用于某些 SELECT 和 INSERT 语句,而且其中 UPDATE、DELETE 和

阅读全文

解决SQL速度慢的方法

下面是我多年经验的总结: 网络编程总要和数据库打交道。和数据库打交道总要接触到SQL。如何使你的SQL 跑得快一点,本文介绍几种行之有效的方法: 方法一、尽量使用复杂的SQL来代替简单的一堆SQL. 同样的事务,一个复杂的SQL完成的效率高于一堆简单SQL完成的效率。有多个查询时,要善于使用JOIN。 oRs=objDBC.Execute('SELECT * FROM Books') for(; !oRs.Eof; oRs.MoveNext()) { oRs2=objDBC.Execute('SELECT * FROM Authors WHERE AuthorID='' oRs ('Au...
阅读全文

在VB中压缩ACCESS数据库

如果您在Access数据库、Access项目中删除数据或对象,可能会产生碎片并导致磁盘空间使用效率的降低。同时,数据库文件的大小并未减小,而是不断的增大,直至您的硬盘没有空间。有没有好的处理方法呢?其实,在Access中可以对数据库进行压缩优化以提升Access数据库和Access项目的性能,这样的压缩处理的实质是复制该文件,并重新组织文件在磁盘上的存储方式。但是,在Access项目中进行这样的压缩不会影响到数据库对象(例如表或视图),因为它们是存储在Microsoft SQL Server数据库中而不是在Access项目本身中。同样,这样的压缩也不会影响到Access项目中的自动编号。在Access数据库中,如果已经从表的末尾删除了记录,压缩该数据库是就会重新设置自动编号值。添加的下一个记录的自动编号值将会比表中没有删除的最后记录的自动编号值大一。
下面介绍如何在VB中用一个CompactJetDatabase过程实现对Access数据库文件的压缩处理,在这个过程中有一个可选参数,就是在压缩前你是否需要把原有的数据库文件备份到临时目录(True或False)。我用此办法使21.6MB的数据库压缩到仅仅300KB。
'这些代码可放在模块中,在其他窗体也使用
Public Declare Function GetTempPath Lib "kernel32" Alias _
"GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Public Const MAX_PATH = 260
Public Sub CompactJetDatabase(Location As String, Optional BackupOriginal As Boolean = True)
On Error GoTo CompactErr
Dim strBackupFile As String
Dim strTempFile As String
'检查数据库文件是否存在
If Len(Dir(Location)) Then
'如果需要备份就执行备份
If BackupOriginal = True Then
strBackupFile = GetTemporaryPath & "backup.mdb"
If Len(Dir(strBackupFile)) Then Kill strBackupFile
FileCopy Location, strBackupFile
End If
'创建临时文件名
strTempFile = GetTemporaryPath & "temp.mdb"
If Len(Dir(strTempFile)) Then Kill strTempFile
'通过DBEngine压缩数据库文件
DBEngine.CompactDatabase Location, strTempFile
'删除原来的数据库文件
Kill Location
'拷贝刚刚压缩过临时数据库文件至原来位置
FileCopy strTempFile, Location

阅读全文

如何在SQL Server中恢复数据

在SQL server 中恢复数据的几种办法:
1.自然就是 backup 的 恢复方法 backup 这种方法是最安全,最可靠的方法操作起来也很简单,只要在 sql server 的 enterprise manager中选择 restore 就可以了。
用T-SQL 也可以完成:
RESTORE DATABASE test FROM DISK = ’c:mssql7ackup est.bak’
当然这是用的 文件恢复,如果是 设备恢复 自然也是可以的。
2.可是有的时候,SQL server 是在我们毫无准备的情况下瘫痪的,有的时候是伴随者 NT 的瘫痪而引起的,(这个时候,豆腐想 墙上 Gates 的画像有仍了几个 西红柿),怎么办呢?这个时候就只有采用 sql server 的 t-sql 中提供的系统存储过程了:
sp_atach_db
在这里举一个简单的例子:
sp_attach_db @dbname = N’pubs’,
@filename1 = N’c:mssql7datapubs.mdf’,
@filename2 = N’c:mssql7datapubs_log.ldf’
这种方法应该说是有很高的成功率的,不过在 实践中 豆腐听说 这样后,数据库成为只读的,那也没有办法了。如果只有 mdf 没有 ldf 文件的话,可以使用 sp_attach_single_file
sp_attach_single_file_db @dbname = ’pubs’, @physname = ’c:mssql7datapubs.mdf’
这个方法本来是 用来 对 sp_deatach 的操作的反操作,不过直接使用也还是可以成功的。

阅读全文

怎样用SQL 2000 生成XML

以前在介绍SQL2k的时候已经提到了SQL2k对XML的支持,使用for XML语句就可以很容易的把执行的结果转化为一个XML,这样可以在很大程度上提高系统运行效率和开发速度,详细的内容请参见Books Online。
但是在使用ADO(Required ADO 2.6)访问返回的XML的方式和原来的Recordset是有所不同的。如果你还是使用Recordset访问的话,只能得到一个Unicode格式的XML Schema,而无法得到XML的内容。
其实这个问题也是很容易就能解决的,只是我自以为很熟悉ADO,没有仔细看Help,所以没有发现ADO是采用Stream的方式来得到和返回XML的。
Command 对象有两个属性,叫Input Stream和Output Stream,属性的值是一个IUnknown接口。可以把一个XML Parser的接口赋给它,或者是直接用Request、Response等。这样的好处是不需要再去生成一个Recordset,不需要去保存这些数据,从而节省了系统开销。

阅读全文

如何得到当前所在的sql的数据库名称

这里有几个关于SQL SERVER的问题想向您请教(服务器端脚本编程):
(1)如何在SQL SERVER中用SQL语句获得当前的数据库名称?
(2)如何在定义一个全局变量而不是局部变量,因为我在这里定义了
一个循环,在这个循环里有对一个临时表加字段和对临时表插入数据
的操作。但这两个操作必须放在不同的批次里.(需要用GO语句分开)。
这时控制循环的变量参数就不起作用了,因为变量参数只能在一个
批次里起作用,到下一个批次就要重新定义了。真头疼!能不能定义
全局变量,让它在所有批次中都起作用?
这两个问题,其实并不具有一定的普遍性,但是解决这两个问题的 思路和方法 却有一定的 普遍性,所以我专门把这两个问题拿出来 讲一下
(1)首先 这个当前 所在 DataBase 肯定需要用到 系统存储过程 这一点是 十分肯定的,我自然想到了sp_who 执行后,列出了当前所有的 系统进程的 所有信息,我一看 有 Runnable,有 Slepping 肯定应该是 runnable 了,一看 他的 spid 想起来了,有个系统的 全局变量@@SPID,先试一下,sp_who @@spid 哈哈 成功了这个问题的解决之道 是 一定要熟悉 系统的存储过程和系统全局变量,并且要善于观察和思考
(2) 至于 第二个问题,则纯粹是一种 t-sql 编程的思路问题,首先我不赞同用一个规则去判断两个 存储过程,因为这不符和 t-SQL 编程的规范,但是既然问题出来了,就要想办法 解决,我们知道在 两个批次里 是不可能共巷数据的,所以 我想到了 cursor 游标,最终 经过测试,也成功了。

阅读全文