mysql的编码问题以及购物网站的数据库设计

 查看mysql的编码方式:

 Database changed
 mysql> show variables like 'character_set_%';
 +--------------------------+--------------------------------+
 | Variable_name       | Value              |
 +--------------------------+--------------------------------+
 | character_set_client   | latin1             |
 | character_set_connection | latin1             |
 | character_set_database  | utf8              |
 | character_set_filesystem | binary             |
 | character_set_results   | latin1             |
 | character_set_server   | latin1             |
 | character_set_system   | utf8              |
 | character_sets_dir    | J:\xampp\mysql\share\charsets\ |
 +--------------------------+--------------------------------+

 

通过命令行修改:

 set character_set_client=utf8;
 
  set character_set_connection=utf8;
 
  set character_set_database=utf8;
 
  set character_set_results=utf8;
 
  set character_set_server=utf8;
 
 set character_set_system=utf8;
 
  set collation_connection=utf8;
 
  set collation_database=utf8;
 
 set collation_server=utf8;

修改数据库的字符集:

  mysql>use mydb
   mysql>alter database mydb character set utf-8;

修改数据库的字符集
  mysql>use mydb
   mysql>alter database mydb character set utf-8;
创建数据库指定数据库的字符集
==============================================================
mysql> create database mxchen_rms character set 'utf8';
 Query OK, 1 row affected (0.00 sec);

考虑到网页显示使用的是utf-8;所以将mysql的数据库编码也有安装时候默认的gbk转换成了utf-8;

不过这样向数据库中插入不了中文。(待解决的问题)

=================下面是简单购物网站的数据库设计=========================

create database shop ;
--普通用户的表格
create table users(
userid bigint primary key AUTO_INCREMENT,
username varchar(30) not null unique,
truename varchar(30) not null,
passwd varchar(30) not null,
email varchar(40) not null,
phone varchar(20) not null,
postcode char(6) not null,
address varchar(30) not null,
grade int default 5
);
--向用户表中初始化一个用户,将来可以通过注册界面来加入
 
insert into users values(null,'bobo','libo','bobo','1055435367@qq.com','15652965560','123456','河南省郑州市',1);
 
--货物表格
create table goods(
goodsId bigint primary key auto_increment,
goodsName varchar(40),
goodsIntro varchar(500),
goodsPrice float,
goodsNum int,
publisher varchar(40),
photo varchar(40),
type varchar(10));
--首先向货物表格中添加系列数据
insert into goods values(null,'黑白森林','这是一部好片子',59.0,1,'香港嘉禾出品','01.jpg','香港电影');
insert into goods values(null,'金鸡','这是一部好片子',50.0,1,'香港嘉禾出品','02.jpg','香港电影');
insert into goods values(null,'靓女菜馆','这是一部好片子',99.0,1,'香港嘉禾出品','03.jpg','香港电影');
insert into goods values(null,'布衣神相','这是一部好片子',19.0,1,'香港嘉禾出品','04.jpg','香港电影');
insert into goods values(null,'洛神','这是一部好片子',68.0,1,'香港嘉禾出品','05.jpg','香港电影');
insert into goods values(null,'黑白森林','这是一部好片子',59.0,1,'香港嘉禾出品','01.jpg','香港电影');
insert into goods values(null,'黑白森林','这是一部好片子',59.0,1,'香港嘉禾出品','01.jpg','香港电影');
insert into goods values(null,'金鸡','这是一部好片子',50.0,1,'香港嘉禾出品','02.jpg','香港电影');

===================下面麻烦的是订单表格的设计=======================

如果将订单相关的所有数据都放置在一张表格中,会发现其中存在大量的数据冗余,解决方法是,将重复的字段单独拿出来做成一张表(订单表);将不重复的字段做成一张表(订单细节表); 
这其实是数据库的设计模式问题,当表和表之间有多对多的关系时候,(一个用户可以选择多个商品,一个商品可以有多个用户选择);此时应当使用中间表格来解决数据冗余的问题。这样可以将多对多的问题转换成为一对多的问题,同时解决数据的冗余问题。解决方案如下:

create table orders(
orderId bigint primary key auto_increment,
userId bigint ,
orderDate  TIMESTAMP  NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
payMode enum  ('货到付款','支付宝付款')  default  '货到付款',
isPayed  enum ('0','1') default '0',
tatalPrice float not null,
constraint fk_user_id foreign key(userId) references users(userid));
------------------订单细节表 <这个其实是一张关系表格>
create table orderDetail(
orderId bigint,
goodsId bigint ,
nums int not null,
constraint fk_order_id foreign key(orderId) references orders(orderId),
constraint fk_goods_id foreign key(goodsId) references goods(goodsId));

 

 

posted @ 2012-11-05 20:21  bobo的学习笔记  阅读(389)  评论(0编辑  收藏  举报