数据操作
增加数据,insert into
标准格式
insert into 表名 (字段的列表)value(数据列表);
使用set
insert into 表名 set 字段1=值,2.....;
从其他数据表取数据插入
insert into 表名 (字段列表)select;
和insert into一样也是分在种,标准写法,set语法,从其它表取数据
标准方式
replace into 表名 (字段的列表) values (数据列表)
使用set:
replace into 表名 set 字段1=值1, ……
从其它数据表取数据插入:
replace into 表名 (子段列表) select
和insert into的区别:
Insert into是直接插入,replace into是先判断表中的主键或唯一索引字段是否有和插入数据相应字段的值一样的数据,它就会变成修改!(它会先删除旧数据,然后再写入一条新数据)
如果没有一样的数据,它就会插入一条新数据。
如果准备插入数据的表没有任何主键或唯一索引,则repalce into会直接插入新数据。
它就不判断了!
替换的例子
插入新数据的例子
影响多条数据的例子
发现有两个重复的记录,一个和id为6的记录,还有一个是username为新插入值的那条id为8的数据。
它怎么处理呢?
它会先删除重复的两条数据,再插入一条新数据。因此影响了3行记录!
Replace into在数据有重复的时候,它不等同于update!
查询数据,select
格式:select *或字段列表 from 表名 where 条件
查询是千变万化的。
查询所有数据:
select * from t1;
查询部分数据,加条件
只查询部分字段的内容
修改数据,update
格式:update 表名 set 字段名=新值, ……. Where 条件 order by .. limit ..
思考一下:如果不加where条件会出现什么结果呢?
结果是,把数据里所有的记录都进行了更新!
可以加where order by limit
删除数据,delete
格式:delete from 表名 where .. order by .. limit ..
如果你不是想把表中所有数据都删除,一定要记得写where条件!
不写where的情况,会删除所有数据
可以加更多条件
快速删除所有数据,truncate
格式:truncate 表名;
等同于,delete from 表名;
区别:
- Truncate是直接把表删除,然后再重建表结构。优点是速度快。比一行一行删除快。
- 不会返回受影响的行数。
- Auto_increment自动增量的字段恢复初值。
字符集和校对规则
字符集:一套符号和字符编码的集合。
Gbk utf8 latin1
校对规则:在字符集内用于比较字符的一套规则。
字符在数据库里有四个等级
服务器级:安装数据库时指定的
数据库级:建立database时指定或者继承服务器级
数据表级:建立table时指定或者继承数据库级
字段级:建立数据表时定义字段指定的字符集或者继承表的字符集
因此我们根据我们的项目或网站,安装数据库时最好用我们定好的编码。比如utf8或gbk
创建表可以只指定表的字符集,这时字段会使用表指定的字符集
也可以同时指定表和字段的字符集
客户端的字符集
我们启动一个新客户端,查看数据表中的数据,结果是乱码!
我们查看一下关于编码的变量
Character_set_client 客户端使用的编码
Character_set_connection 数据库连接使用的编码
Character_set_results 返回结果使用的编码
这三个变量的设置影响到数据是否是乱码
数据库返回的数据显示是乱码,怎么做?
方法:设置character_set_results为客户端正确的编码
我们进行数据的插入,会不会有问题呢?
原因是什么?
就是客户端明明是gbk的编码,现在却告诉数据库编码是utf8
Character_set_client现在是utf8!
解决方法:设置客户端编码变量为正确的值
Set character_set_client=gbk;
结论:因此如果客户的这两个变量设置正确,那么无论插入数据还是读数据,都不会乱码!
拿PHP来说,就是你的PHP文件保存成什么格式,你的客户端就是什么编码!
我们把这三个变量可以合成一个:
Set names gbk;
Set names utf8;
create table t2
(
id int unsigned auto_increment primary key,
username varchar(20) not null unique key,
nickname varchar(20) character set utf8
) default character set gbk;
有的同学会不会有疑问,我数据表字段的编码会不会影响客户端的数据插入和显示?
客户端不会出现乱码的情况,原因是数据库会根据客户端的编码进行正确的转换。
总结:
- 首先我们要确认我们的客户端是什么编码。命令行客户端看属性。PHP文件在保存编码。
- 根据客户端编码,用set names gbk或utf8设置编码
就不会有乱码发生了!
PHP操作MYSQL数据库
- 配置php.ini支持mysql扩展
然后还要把扩展库的路径指定正确
- 然后重启apache
如何确定MYSQL函数可用?
用phpinfo()来查看
看到下面的内容,就证明配置正确
- 写程序连接操作数据库
//先连接数据库(并认证)
Mysql_connect(‘localhost:3306’, ‘root’, ‘123456’);
//根据你的文件编码设置正确的编码,通知数据库
$conn = Mysql_query(“set names gbk”); //彻底搞定乱码!
Mysql_query(‘use itcast’);
Mysql_query(‘show databases’);
//………
$result = Mysql_query(‘select * from t2’);
While($row = Mysql_fetch_assoc($result)) {
Print_r($row);
}
Mysql_close($conn);