MySql数据库 | MySql视图 | MySql查询 | MySql Front24 May 2012 18:24 Thursday

magento数据库导入错误 - ERROR 1064 (42000) at line 382: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE, KEY

magento导数据库又遇一个错误:

ERROR 1064 (42000) at line 382: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE,
KEY `FK_ATTRIBUTE_VARCHAR_ENTITY` (`entity_id`),
KEY `FK_CATALO' at line 9

解决办法是,搜索

UNIQUE KEY `IDX_BASE` (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`) USING BTREE

替换为

UNIQUE KEY `IDX_BASE` USING BTREE (`entity_type_id`,`entity_id`,`attribute_id`,`store_id`)

重新导入问题解决。


2011-08-25 10:04:26阅读全文>>>

Mysql批量截取最后隔开的部分到另一字段的SQL语句

字段images保存的数据是: a.jpg;b.jpg;c.jpg

要把images的最后一张图片c.jpg赋值到images_default

执行的SQL语句是

UPDATE product SET `image_default` = REVERSE(MID(REVERSE(`images`),1,LOCATE(';',REVERSE(images))-1)) WHERE product_id > 1


2011-04-12 13:29:42阅读全文>>>

全世界127个主要国家Mysql数据库下载

项目需要。。找了下,改了下,藏。


SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `country`
-- ----------------------------
DROP TABLE IF EXISTS `country`;
CREATE TABLE `country` (
  `country_id` tinyint(3) NOT NULL auto_increment,
  `code` varchar(16) NOT NULL,
  `name_chinese` varchar(128) NOT NULL,
  `name_english` varchar(128) NOT NULL,
  PRIMARY KEY  (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=128 DEFAULT CHARSET=utf8;


-- ----------------------------
-- Records of country
-- ----------------------------
INSERT INTO `country` VALUES ('1', '00', '未知的國家', 'Unknown Country');
INSERT INTO `country` VALUES ('2', 'TT', '千里達與托貝哥共和國 (Trinidad and Tobago)', 'Trinidad and Tobago');
INSERT INTO `country` VALUES ('3', 'TV', '土瓦魯 (Tuvalu)', 'Tuvalu');
INSERT INTO `country` VALUES ('4', 'TR', '土耳其 (Türkiye)', 'T


2011-02-10 14:29:06阅读全文>>>

Magento报错:Call to a member function extend() on a non-object in app\code\core\Mage\Core\Model\Mysql4\Config.php on line 115

遇到报错:Fatal error: Call to a member function extend() on a non-object in \app\code\core\Mage\Core\Model\Mysql4\Config.php on line 115

错误原因及解决办法参见:

Magento错误 - Notice: Undefined index:***app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92的解决办法

里的

SET FOREIGN_KEY_CHECKS=0;
update `core_store` set store_id = 0 where code='admin';
update `core_store_group` set group_id = 0 where name='Default';
update `core_website` set website_id = 0 where code='admin';
update `customer_group` set customer_group_id = 0 where customer_group_code='NOT LOGGED IN';
SET FOREIGN_KEY_CHEC


2010-12-28 15:03:01阅读全文>>>

忘记root密码万能修改MySql密码方法

 

如果本地忘记了root密码  ,可以试试以下方法:

打开CMD首先停止mysql服务

net stop mysql

进入mysql安装目录下的bin文件夹,然后输入

mysqld-nt --skip-grant-tables

跳过密码检测

然后另外新打开一个cmd窗口

输入mysql 直接回车可以以root权限进入mysql

use mysql


2010-12-20 22:00:58阅读全文>>>

Magento错误 - Notice: Undefined index:***app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92的解决办法

今天拷站架Magento 站,又碰到了这种错:

a:4:{i:0;s:116:"Notice: Undefined index :  0  in ***\app\code\core\Mage\Core\Model\Mysql4\Config.php on line 92 ";i:1;s:681:"#0 ***\app\code\core\Mage\Core\Model\Mysql4\Config.php(92): mageCoreErrorHandler(8, 'Undefined index...', 'D:\chen\www\mym...', 92, Array)
#1 ***\app\code\core\Mage\Core\Model\Config.php(344): Mage_Core_Model_Mysql4_Config->loadToXml(Object(Mage_Core_Model_Config))

好 吧,抽时间总结一下。。

问题原因

Mysql使用工具 (如PhpMyAdmin / MySQL-Front / Navicat for MySQL / SQLyogEnt等)重载转储文件(也就是重导.sql文件)的时候,默认在执行过程中遇到0值一般会生成新的序列号。

Magento的 core_store表的admin的store_id为0;core_store_group表的Default的group_id也为0。

在 导入.sql文件的时候,原本的0变成了新的序列号,破坏了Magento原有的数据。

解决办法


2010-12-13 16:08:45阅读全文>>>

利用好MySql的正则 - 查找筛选字段为中文的记录

正则依旧风骚。。

在MySql中使用正则可以达到事半功倍的效果,如,简单看示例,使用mysql筛选出某字段中文的记录:

select * from table where not name regexp '^[1-9A-Za-z]';


2010-12-04 16:58:43阅读全文>>>

PHP - Mysql数据库备份类

使用方法:

require_once("backdata.class.php");
$link = @mysql_connect("localhost","数据库名","密码") or die ('Could not connect to server.');
mysql_query("use cms",$link);
mysql_query("set names utf8",$link);
$dbbck=new backupData($link);//实例化 它,只要一个链接标识就行了
//备份数据时,如想备份一个数据库中的所有表,你可这样写:
$dbbck->backupTables("cms","./",array('*'));
//备份数据时,如想备份一个数据库中的仅一个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user'));
//备份数据时,如想备份一个数据库中的多个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user','acl','informatoin'));
//注解:$dbbck->backupTables("参1"," 参2",array());中,
参1为:数据库名,
参2为:要存放备份数据的位置(即目录地址)
第三个为:你要保存那些表

backdata.class.php:

<?php
/*
*
*简单的一个Mysql备份数据类


2010-11-04 20:20:53阅读全文>>>

服务器重启或mysql重启后导致magento出现表被破坏的报错问题

 

 

 重启服务器后或重启mysql后有时候会发现,magento做的网站打开时出现数据库表损坏的错误提示,如:

SQLSTATE[HY000]: General error: 145 Table ‘./abc /log_visitor’ is marked as crashed and should be repaired

Trace: 
#0 /shares/websites/xxxxxxx.com/lib/Zend/Db/Statement.php(283): Zend_Db_Statement_Pdo->_execute(Array) 
#1 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Abstract.php(406): Zend_Db_Statement->execute(Array) 
#2 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Pdo/Abstract.php(206): Zend_Db_Adapter_Abstract->query(’INSERT INTO `lo...’, Array) 
#3 /shares/websites/www.supercamper.co.uk/lib/Zend/Db/Adapter/Abstract.php(484): Zend_Db_Adapter_Pdo_Abstract->query(’INSERT INTO `lo...’, Array) 
#4 /shares/websites/www.superca


2010-10-17 23:20:35阅读全文>>>

Mysql Front 密钥,激活码,破解

 

 

Mysql Front 到期的时候会提示:程序注册时间到期! 程序将在限制模式下运行.

很明显,需要破解程序了。。

 

下面收集两组Mysql Front 的程序密钥,5.0和5.1的。

 

Mysql Front 5.0 激活码

xrJM6I3WyKM89qwbcEviUtHrub07K57+

G0oCeccGnRml/1Z8+cIG595rmvhJOH+J

9cE5NsM6llSCCNWxg/UZbZdqY7SV5T2a

2oEUR3jy0hpPtFQq1D47ljU6yxzwQCFD

H3213Mq9emTxXuKO5n/KJTX


2010-09-17 00:17:41阅读全文>>>

用shell脚本进行MySQL数据库定时备份

来自:http://tieniuzai.com/

对任何一个已经上线的电子商务站点来说,数据备份都是必须的。无论版本更新还是服务器迁移,备份数据的重要性不言而喻。人工备份数据的方式不单耗费 大量时间和精力,还灰常不专业的说。于是,有了下面这段脚本的出现。参考了网上的很多教程,外加自己的测试,以下脚本测试可用。

#!/bin/bash
#Shell Command For Backup MySQL Database Everyday Automatically By Crontab
#Author : Carlos Wong
#Date : 2010-08-24

#配置参数
USER=root #数据库用户名" >用户
PASSWORD=××××× #数据库用户密码
DATABASE=TIENIUZAI    #数据库名称
WEBMASTER=tieniuzai@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径
LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径
DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)
DUMPFILE=$DATE.sql #备份文件名
ARCHIVE=$DATE.sql.tgz #压缩文件名
OPTIONS=”-u$USER -p$PA


2010-09-12 20:23:31阅读全文>>>

MYSQL应用 - 自定义排序,字段置顶等

在MYSQL数据库查询时,排序是经常用到的一个功能。单纯按照某字段排序查询较为简单,无非就是order by `field` (DESC/ASC)。如:

1 SELECT * FROM `table`
2 ORDER BY `field` DESC

注:上面的 table换成要查询的表名,field换成要排序的字段名,DESC表示从大到小,去掉则从小到大。

下面介绍几个复杂一点的应用:

自 定义排序

需求:查询table表,取出id为1,5,9,7的记录,并按1597的顺序显示.

解决:


2010-09-02 14:08:03阅读全文>>>

linux 里的mysql命令总结 - 学习linux+mysql必备

一、总结一下Linux下MySQL的一些命令:

1.Linux下启动mysql的命令:
mysqladmin start
/ect/init.d/mysql start (前面为mysql的安装路径)

2.Linux下重启mysql的命令:
mysqladmin restart
/ect/init.d/mysql restart (前面为mysql的安装路径)

3.Linux下关闭mysql的命令:
mysqladmin shutdown
/ect/init.d/mysql shutdown (前面为mysql的安装路径)

4.连接本机上的mysql:
进入目录mysql\bin,再


2010-08-20 11:15:58阅读全文>>>

mysql数据库解除外键

magento的数据库导入导出要处理外键的问题。

经过测试,只要加上这段话便可顺利解除外键。

 

头 部
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 *


2010-07-13 10:53:14阅读全文>>>

mysql front 注册码

bhaaAThangemMkaz2tQhq3/f7dZ7
Vj29WeGHjuupj/AhYqymjAuokhYi
X1T/fG+q1yR22PdcEP39dxU3ovEo
lLLzwIZlQr9oJYwUf5eG4x5e1bMP
nfIaIl8reszQPHFNbrxBjCVrBEXL
TyBLehxzUpVI672t3LjX8q4ytCRC
ezcoZQfMAc0DulJzNREbwlcf0Rco
N0zW3ojBUxGsplBBZZPrD7/bPhkM
rjtS8Bxym+HeV1TJDTXuiL8QLg==

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

fSbC9xxy7ga57DOrLz9mMqYSFx8S
OIWiOBI61uJ562GINVTVNBDaGBIl
Cuni0a1iUAF88I6zrHzH9Wzcv4h+
h3wTGgOX8mYgN0jEEOmzI1DLx0DJ
8t94hUJ5O0I99Ts6iqvHhw24jYfI
h++JG/BzVLnaSDbNdqH9i


2010-07-13 10:47:47阅读全文>>>

mysql纵表查询遇到的一个问题

A表:
CREATE   TABLE   `a`   (
    `aid`   int(11)   NOT   NULL,
    `astate`   int(1)   NOT   NULL
)   ENGINE=InnoDB   DEFAULT   CHARSET=utf8;

INSERT   INTO   `a`   (`aid`,   `astate`)   VALUES
(1,   1),
(2,   1),
(3,   1);


B表:
CREATE   TABLE   `b`   (
    `bid`   int(11)   NOT   NULL,
    `bfield`   varchar(255)   NOT   NULL
)   ENGINE=InnoDB   DEFAULT   CHARSET=utf8;

INSERT   INTO   `b`   (`bid`,   `bfield`)   VALUES
(1,   'f1 '),
(2,   'f2 '),
(3,   'f3 '),


2010-07-05 16:06:30阅读全文>>>

mysql 批量查找和替换

批量查找:

        SELECT a.products_name FROM nike.products_description a WHERE a.products_name like '%#%'

#为要查找的字符串

 

 

批 量替换:

UPDATE article SET
content = replace(content, ’sjolzy’, ’sjolzy.cn')
WHERE name like '%#%';

article 为表 content为字段  sjolzy为


2010-06-22 10:40:14阅读全文>>>

mysql多表联结查询

MySQL支持Select和某些Update和Delete情况下的Join语法,具体语法上的细节有:

 table_references:

    table_reference [, table_reference] …

 table_reference:

    table_factor

  | join_table

 table_factor:

    tbl_name [[AS] alias]

        [{USE|IGNORE|FORCE} INDEX (key_list)]

  | ( table_references )


2010-06-18 16:18:30阅读全文>>>

mysql 合并两表的相同字段

 

 

(SELECT ts.products_id,ts.sort from top_selling ts)

union(SELECT na.products_id,na.sort from new_arrival na)

order by rand()

limit 4


2010-05-31 16:18:19阅读全文>>>

mysql多表关联数据同时删除

 

category(栏目信息表)和news(新闻数据表)。 

category中的id(栏目编号)字段作为该表的主键(primary key).唯一标识了一个栏目的信息。 
news 中的id字段作为该表的主键(primary key).唯一标识了一个栏目的信息。 

category_id(栏目编号)字段与category表的id字段相关联。 

1.SQL删除语句 

sql = "delete category,news from category left join news on category.id = news.category_id where category.id= ?";  


2010-03-29 12:51:48阅读全文>>>

深入Mysql字符集设置

基本概念

• 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等;

• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码;

• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{’A’,’B’}时,{’A’=>0, ‘B’=>1}就是一个字符集;

• 字符序(Collation)是指在同一字符集内字符之间的比较规则;

• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;

• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation);

• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

 

MySQL字符集设置

• 系统变量:


2010-03-17 02:38:12阅读全文>>>

MySQL 编码机制

 

一般在MYSQL使用中文查询 都是用 set NAMES character

character_set_client ,这是用户告诉MySQL查询是用的什么字符集。 

character_set_connection ,MySQL接受到用户查询后,按照character_set_client将其转化为character_set_connection设定的字符集。 

character_set_results , MySQL将存储的数据转换成character_set_results中设定的字符集发送给用户。 

 

DISCUZ并没有使用set NAMES character 

SET NAMES 'x'语句与这三个语句等价: 

mysql> SET character_set_client =


2010-03-16 13:54:28阅读全文>>>

MySQL客户端HeidiSQL

 

HeidiSQL个人使用感受如下:

 

体积小,安装文件只有1.7M

 

速度:操作流畅,终于不卡了

 

用户体验:,查看表数据和结构只需要切换选项卡即可,不需要复杂鼠标的操作

 

高级功能,提供查看数据库状态和维护功能

 

不足:不能图形管理触发器和作


2010-03-15 23:13:35阅读全文>>>

mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别

<?php
$link=mysql_connect('localhost','root',”);
mysql_select_db('abc',$link);
$sql = “select * from book”;
$result = mysql_query($sql);
while($row = mysql_fetch_row($result))
{
echo $row['cid'].'::'.$row[1].'<br>';
}
$result = mysql_query($sql);
while($row = mysql_fetch_array($result))
{
echo $row['cid'].'::'.$row[1].'<br>';
}
$result = mysql_query($sql);
while($row = mysql_fetch_object($result))
{
echo $row->cid.'::'.$row->title.”<br>”;
}
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result))
{
echo $row['cid'].'::'.$row[1].'<br>';
}
?>


分析:
mysql_fetch_row, 这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。 注意,这里是从0开始偏移,也就是说不能用字段名字来取值,只能用索引来取值,所以如下代码是取不到值的:
while($row = mysql_fetch_row($res)){


2009-12-28 19:23:47阅读全文>>>

关于mysql持久连接(mysql_connect与mysql_pconnect)【很明白】

在某些场合,mysql_pconnect( ) 是不适用的。

——————————————————————————–

状况一:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 固定只对 MySQL server 上的某一个数据库进行存取动作。

 因为每次存取数据库时,都是由 web 那边使用同一账号对 MySQL 上的同一数据库作业,若我们将 MySQL 与 web server 的「同时联机数」都调整为 200,就好像 MySQL 这边一直有 200 位「服务生」,随时等着接待来自 web 的 200 位「顾客」似的。而且「顾客」离开之后,「服务生」也不下场休息,时时都站在门口等着接待下一个「顾客」。

 在这种情况下,您只要注意将 MySQL 的「同时联机数」调得比 web server 的高或相等,就会发现使用 mysql_pconnect( ) 是个不错的选择。
——————————————————————————–

状况二:

 使用 1 部 web server 与 1 部 MySQL server(两者可能同在一部主机上),而 web server 会对 MySQL server 上的两个数据库进行存取动作。

 从 web server 那边提出数据存取需求时,有时是针对第 1 个数据库(DB1),有时则是针对第 2 个数据库(DB2)。若我们也将 MySQL 与 web server 的「同时联机数」都调整为 200,这样一来,就好像 MySQL 这边有 200 位「服务生」,但同时经营两个「吧台」(DB1 与 DB2),而「顾客」可能多达 200 位。

 一开始,DB1 这个「吧台」比较热门,MySQL 派了 150 位「服务生」上场接待;同样地,当「顾客」离开之后,这 150 位「服务生」仍守着 DB1 而不下场休息。后来,DB2 那边也热闹起来了,「顾客」越来越多,MySQL 得加派「服务生」上场,有几个能派?答案是 50 个!

 为什么「服务生」的人力调配会捉襟见肘?那是因为 web 那边使用了 mysql_pconnect( ) 来建立联机。「服务生」一开始被指定到哪个「吧台」工作,就会持续在那边停留,绝不「转台」。
——————————————————————————–

 请注意,当使用持续性的联机时,每个已建立的联机只为来自同一部 web server、使用同一组账号,且存取同一数据库的使用者服务。


2009-12-28 19:15:38阅读全文>>>

Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决篇

在系统中出现乱码一般是编码设定和编码转换问题,那么我们来看看当中有多少编码设定和编码转换的呢?



显示界面,JSP 2.0      

JAVA容器:Tomcat 5.X

MVC构架:Struts 1.2

ORM工具:Hibernate 3

数据库:MySQL   5.0

编译IDE:MyEclipse 5.0



知道了有六个地方要设定编码,那么哪种编码最好呢?使用中文可以GBK,但我认为UTF-8会是更好的选择,如果想知道了解编码的更多细节,请访问:

计算机编码大全-A

计算机编码大全-B


2009-12-10 22:36:43阅读全文>>>

MySQL日期时间类型使用总结

MySQL:如何获得 MySQL 毫秒、微秒
MySQL:Grant 语法详解(MySQL 5.X)

MySQL:MySQL日期数据类型、MySQL时间类型使用总结
MySQL 日期类型:日期格式、所占存储空间、日期范围 比较。
日期类型        存储空间       日期格式                 日期范围
------------ ---------   --------------------- -----------------------------------------
datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp      4 bytes   YYYY-MM-DD HH:MM:SS   1970-01-01 00:00:01 ~ 2038
date           3 bytes   YYYY-MM-DD            1000-01-01          ~ 9999-12-31
year           1 bytes   YYYY                  1901                ~ 2155

在 MySQL 中创建表时,对照上面的表格,很容易就能选择到合适自己的数据类型。不过到底是选择 datetime 还是 timestamp,可

能会有点犯难。这两个日期时间类型各有优点:datetime 的日期范围比较大;timestamp 所占存储空间比较小,只是 datetime 的

一半。


2009-12-07 22:44:48阅读全文>>>

mysql常用函数

控制流函数
IFNULL(expr1,expr2)
如果expr1不是NULLIFNULL()返回expr1,否则它返回expr2IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql> select IFNULL(1,0);
        -> 1
mysql> select IFNULL(0,10);
        -> 0
mysql> select IFNULL(1/0,10);
        -> 10
mysql> select IFNULL(1/0,'yes');
        -> 'yes'

IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0expr1<>NULL),那么IF()返回expr2,否则它返回expr3IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql> select IF(1>2,2,3);
        -> 3
mysql> select IF(1<2,'yes','no');
        -> 'yes'
mysql> select IF(strcmp('test','test1'),'yes','no');
        -> 'no'

2009-12-02 21:53:09阅读全文>>>

MySQL视图的应用

MySQL视图的应用

视图也称虚表,包括执行某个查询返回的一组记录。视图可以简化获取数据的方法,并通过别名来实现抽象查询。

实例258:创建视图

实例说明

为了简化查询,在实际项目开发过程中,通常可以采用为数据库中的某个表建立视图的方式。在建立的视图中只有开发人员所关心的字段。运行本实例,如图 9.6所示,分别在图中输入登录用户的用户名和密码,单击“进入”按钮后,如果用户输入错误的用户名或密码,则给出错误提示,反之如果输入的用户名和密码 正确,则提示成功登录。由于本实例采用视图建立了虚表,所以应首先在“命令提示符”下建立视图,如图9.7所示。


图9.6 用户身份验证

9.7 创建视图

技术要点


2009-12-01 01:39:13阅读全文>>>

MySQL存储过程

MySQL存储过程

MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。

实例261:存储过程的创建

实例说明

为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。

技术要点

一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程:

create procedure proc_name (in parameter integer)
begin
declare variable varchar(20);
if parameter=1 then
set variable='MySQL';
else
set variable='PHP';
end if;
insert into tb (name) values (variable);
end;

MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。


2009-12-01 01:38:33阅读全文>>>

MySQL触发器

MySQL触发器

触发器在数据库系统开发过程中具有非常重要的作用,例如可以防止有害数据录入数据库,可以改变或取消insert、update和delete语句的执行及在一个会话中监听数据库中的数据的改变。

实例263:创建触发器

实例说明

如果用户打算在数据库中通过触发器实现某一动作的监听,那么首先应该创建触发器,触发器是在“命令提示符”下创建的,如图9.16所示。

图9.16 触发器创建过程

技术要点


2009-12-01 01:37:43阅读全文>>>

MySQL事务

MySQL事务

事务处理机制在程序开发过程中有着非常重要的作用,它可以使整个系统更加安全,例如在银行处理转账业务时,如果A账户中的金额刚被发出,而B账户还 没来得及接收就发生停电,这会给银行和个人带来很大的经济损失。采用事务处理机制,一旦在转账过程中发生意外,则程序将回滚,不做任何处理。

实例265:使用事务处理技术实现关联表间信息的删除

实例说明

MySQL数据库中的表可以通过主键相互关联,例如学生成绩管理系统中,学生表和成绩表可以通过id实现关联,所以在删除某个学生信息时,只需删除 这两个表中为该id的所有记录。但是,当对成绩表实现删除相关id工作后,还没来得及删除学生信息表中该学生的信息时就发生停电等意外,则再重新查找该学 生的成绩时,是无法查找到该学生成绩的。

本实例将采用事务处理方式,对学生信息表和学生成绩表中的数据进行删除,运行本实例,学生信息及学生成绩信息分别如图9.18及图9.19所示。当删除图9.18中的学生信息后,查看学生成绩信息可以发现与该学生对应的成绩全部删除。


2009-12-01 01:36:27阅读全文>>>

session保存在mysql

默认情况下,PHP会话(session)是通过文件来保存的。这样做有以下几个缺点:

  1. 会话文件一般都很小,但文件数却很多,在文件系统中保存许多这样的小文件非常浪费空间,且效率不高。
  2. 分布式的站点难以利用会话文件来共享会话。
  3. 会话文件方式不利于统计在线用户的会话信息。

为解决以上问题,我们可以考虑用数据库来保存会话信息。

对于 PHP 开发来说,保存会话用 MySQL 是一个非常不错的选择。MySQL 提供一种建立在内存中的表类型 Heap,如果每条会话数据量很小的话,可以考虑用这种类型的表来进一步优化性能。但是 Heap 类型的表有许多限制,例如它不支持 text 类型的字段,因此如果在无法预测会话数据记录长度的情况下,选择 MyISAM 是比较合适的,这种类型的表没有事物处理开销,对于基于磁盘的表可以得到最优性能。

下面是 sessions 表的结构:

sessions.sql
  1. DROP TABLE IF EXISTS `sessions`;
  2. CREATE TABLE `sessions` (
  3. `session_id` varchar(32) NOT NULL default '',
  4. `user_id` int(10) unsigned NOT NULL default '0',
  5. `data_value` text NOT NULL,
  6. `last_visit` timestamp(14) NOT NULL,
  7. PRIMARY KEY (`session_id`),
  8. KEY `user_id` (`user_id`)
  9. ) TYPE=MyISAM;

2009-12-01 00:49:06阅读全文>>>

三种方法连接及操作MYSQL数据库

1、使用Mysqli操作Mysql                //注:mysqli 扩展允许用户访问由MySQL 4.1或更高版本所提供的功能。
$connect = mysqli_connect("host","username","passwd","db",port);
/**
* 以上是与MYSQL建立连接。
* host:为MYSQL主机地址类型为字符型。
* username:为MYSQL登录用户名类型为字符型。
* passwd:为MYSQL登录密码类型为字符型。
* db:为MYSQL数据库名称类型为字符型。
* port:为MYSQL数据库的端口号。
*/

$sSQL = "select * from db";
/*需要执行的SQL语句*/
$query = mysqli_query($connect,$sSQL);
/*
$connect:link为链接源
$sSQL:query为请求也指的是需执行的SQL语句
*/

while($arr = mysqli_fetch_array($query)){
/*$query:循环$query所执行的结果*/
print_r($arr);
/*输入相应该的字段值*/
}
mysqli_free_result($query);
/*释放结果集*/
mysqli_close($connect);
/*关闭数据库连接*/

2、使用Mysql操作Mysql
mysql_connect("host","username","passwd",port);


2009-12-01 00:16:28阅读全文>>>

MySQL数据表类型

mysql数据库转移跟数据表的类型有关 MyISAM是可移植的
MySQL数据表类型如下:
MySQL数据表支持六种类型 ,分 别是:BDB、HEAP、ISAM、MERGE、MYISAM、InnoBDB,这六种又分为两类,单独一类是BDB,称为"事务安全型" (transaction-safe),其余都属于第二类,称为“非事务安全型"(non-transaction-safe)。下面详细介绍这些表:

事务安全型
        BDB 全称是"Brekeley DB",它是Mysql具有事务能力的表的类型,由Sleepycat Software (http://www.sleepycat.com)开发。它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。

非事务安全型
       HEAP
        HEAP表是MySQL表中访问最快的表,主要是由于这类表使用保存期在内存中的散列索引,但必须注意的是,如果MySQL或者服务器崩溃,表中数据全部丢失。
ISAM
      ISAM表是MyISAM类型出现之前,MySQL表使用的默认类型,建议改用MyISAM。
MEREG
      MEREG是一种值得关注的新式表,它是由一组MyISAM表组成,之所合并主要出于性能上考虑,因为它能够提高搜索速度,提高修复效率,节省磁盘空间。
MyISAM
      MyISAM是MySQL表默认的类型,它是基于ISAM类型,但它增加了许多有用的扩展,下面是MyISAM一些优点:
        1.比ISAM表更小,所占资源更少


2009-11-30 23:16:50阅读全文>>>

mysql触发器

Why Triggers 为什么要用触发器

  我们在MySQL 5.0中包含对触发器的支持是由于以下原因:

  MySQL早期版本的用户长期有需要触发器的要求。
我们曾经许诺支持所有ANSI标准的特性。
您可以使用它来检查或预防坏的数据进入数据库。
您可以改变或者取消INSERT, UPDATE以及DELETE语句。
您可以在一个会话中监视数据改变的动作。

在这里我假定大家都读过"MySQL新特性"丛书的第一集--"MySQL存储过程",那么大家都应该知道MySQL至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。特别举个例子:

复合语句(BEGIN / END)是合法的.

流控制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.

变量声明(DECLARE)以及指派(SET)是合法的.

允许条件声明.

异常处理声明也是允许的.

但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETE

DROP 'FLUSH PRIVILEGES' GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE

ROLLBACK SAVEPOINT 'SELECT FROM table'

'SET system variable' 'SET TRANSACTION'

SHOW 'START TRANSACTION' TRUNCATE UPDATE


2009-11-30 23:11:58阅读全文>>>

MySQL与事务

先来明确一下事务涉及的相关知识:

事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:

原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。

一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。

隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。

持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。

再来看看哪些问题会用到事务处理:

这里不说“银行转帐”的例子了,说一个大家实际更容易遇到的“网上购书”的例子。先假设一下问题的背景:网上购书,某书(数据库编号为123)只剩最后一本,而这个时候,两个用户对这本书几乎同时发出了购买请求,让我们看看整个过程:

在具体分析之前,先来看看数据表的定义:

-------------------------------------------------------------------------------


2009-11-30 22:58:07阅读全文>>>

mysql错误代码与解决方法

 

常见的数据库错误的解决方法!
这里所说的是MySQL Query Error提示错误的解决方法,部分是完全可以自己动手解决的,没有多大必要一遍遍问。除非是常规方法不能解决的~
下面是常见安装插件会出现的数据库错误信息提示:

CODE:Duplicate column name 'allowrank'
升级数据偶尔这样吧,表示这个表已经存在。但是如果是安装的话不影响下面的步骤。插件编写过程出现这个问题,就换个表名吧。
CODE:Error: Duplicate entry 'aa2HV2' for key 1
Errno.: 1062
一般是键值被重复输入了,导致的重复错误,可以重新建表来解决这个问题。

CODE:Error: Unknown system variable 'NAMES'
Errno.: 1193
导入数据时候容易出现的。打开SQL文件
1、删除SET NAMES'gbk'
2、找到ENGINE=MYISAM DEFAULT CHARSET=gbk,替换为:TYPE=MYISAM
3、找到ENGINE=HEAP DEFAULT CHARSET=gbk,替换为:TYPE=HEAP
4、character set gbk collate gbk_bin,删除。
5、重新恢复即可。


2009-11-30 22:34:13阅读全文>>>

命令:mysql的备份与恢复

备份数据:
mysqldump -u 用户名 -p 密码 数据库名 > XX.sql


数据量大的时候,可以使用gzip压缩一下
mysqldump -u 用户名 -p 密码 数据库名 | gzip > XX.sql.gz

恢复数据:
mysql -u 用户名 -p 密码 数据库名 < XX.sql


从gzip压缩文件中直接恢复
gzip < XX.sql.gz | mysql -u 用户名 -p 密码 数据库名


2009-11-30 22:15:44阅读全文>>>

mysql时间戳转换成可读时间格式

代码:

SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S')

附:
在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式
使用 FROM_UNIXTIME函数,具体如下:

代码:
FROM_UNIXTIME(unix_timestamp,format)

返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December)


2009-11-30 22:03:18阅读全文>>>

MySQL数据库性能优化的关键参数

关键参数一:back_log

要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。

back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值 对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。

当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。

关键参数二:interactive_timeout

服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。

关键参数三:key_buffer_size

索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你 能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为 402649088(400MB)。

关键参数四:max_connections


2009-11-30 20:41:10阅读全文>>>

PHP的事务处理 MYSQL

/*
MYSQL的事务处理主要有两种方法。
1、用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚
commit 事务确认
2、直接用set来改变mysql的自动提交模式
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
set autocommit=0 禁止自动提交
set autocommit=1 开启自动提交
来实现事务的处理。
当你用 set autocommit=0 的时候,你以后所有的SQL都将做为事务处理,直到你用commit确认或rollback结束。
注意当你结束这个事务的同时也开启了个新的事务!按第一种方法只将当前的作为一个事务!
个人推荐使用第一种方法!
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!
***:一般MYSQL数据库默认的引擎是MyISAM,这种引擎不支持事务!如果要让MYSQL支持事务,可以自己手动修改:
方法如下:1.修改c:\appserv\mysql\my.ini文件,找到skip-InnoDB,在前面加上#,后保存文件。
2.在运行中输入:services.msc,重启mysql服务。
3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了。
也就说明支持事务transaction了。
4.在创建表时,就可以为Storage Engine选择InnoDB引擎了。如果是以前创建的表,可以使用mysql->alter table table_name type=InnoDB;
或 mysql->alter table table_name engine=InnoDB;来改变数据表的引擎以支持事务。
*/


2009-11-30 20:12:37阅读全文>>>

php中的事务处理 mysqli

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!

<?php
$db = new mysqli("localhost","root","","test"); //连接数据库

$db->autocommit(false); //设置为非自动提交——事务处理

$sql1  = "INSERT INTO `test`.`test1` (`name` )VALUES ('1' )";

$result1 = $db->query($sql1);

$sql2  = "INSERT INTO `test`.`test2` (`a` )VALUES ('1')";

$result2 = $db->query($sql2);

if ($result1 && $result2) {


2009-11-30 20:09:32阅读全文>>>

发表评论:(这里的评论会加到留言板)