mysql数据库int(1)和tinyint(1)的区别

问题:int(1) 和 tinyint(1) 有什么区别呢?

查了下mysql中设置了储存类型后,储存是定长的,也就是说,int(1) 和 int(4) 在硬盘中所占的字节数都是一样的。

int类型占4个字节,tinyint占1个字节。int(1) 和 int(4) 从本身长度还是存储方式上都是一样的,区别就是显示的长度不同。

int(1) 和 tinyint(1) ,在设计数据库的时候应该选择tinyint(1)。所占的储存空间越少越好,当然要够用才行。像储存一个个位数的字段,还是用tinyint(1)的好。

总结:

1.规定类型之后,存储是定长的,int(1)和int(4)从本身长度还是存储方式上都是一样的。mysql里,int(1)和int(4)的区别就是显示的长度,但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,如2 int(3)指定后就会显示为002
2.int 存储占4个字节, tinyint   存储占1个字节,存储长度决定了他们表示的数字范围不同。int表示的数字范围是:从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。tinyint 表示的范围是0-255之间的数字。
3.tinyint(1),和tinyint(3)没什么区别,存123都能存的下,而如果tinyint(3) zerofill 的话,插入值 12,会存储012,zerofill自动左边补零,这才是限制显示长度。

精简总结:

tinyint(1)  和 tinyint(3) 没什么区别,占用字节都是一位,存储范围都是一样的

tinyint(3) zerofill ,当插入的数据少于3位的时候,左边自动补零,这才是限制显示长度

int(1) 和 tinyint(1) ,够用的情况下,优先选择tinyint(1),因为占字节少、节省空间。

tinyint一个字节   smallint  两个字节   MEDIUMINT三个字节  int 4个字节  BIGINT 8个字节。

 

在thinkphp中集成微信JS-SDK示例代码(非常详细)

1.这里使用的环境是thinkphp5.0.7

2.登录微信公众号后台设置JS安全域名,这一步不多说

3.下载JS-SDK官方demo

·地址:http://demo.open.weixin.qq.com/jssdk/sample.zip

下载后解压出来php版本,如下图所示:

 

 

 

 

 

 

4.开始动工

在你的tp5框架的的第三方接口扩展目录下(我这里是extend)里面建立文件夹,命名为org(为了标准),把这4个文件复制进去,不要忘记设置命名空间,如下图所示

 

 

 

 

 

 

 

 

 

 

 

 

因为tp路由的关系,所以我们要对JSSDK.php的内容进行改写。定义path私有属性,改写路径。代码如下

 

 

 

 

 

 

 

 

 

 

 

 

5.开始调用

完成上述操作之后,我们已经成功的将微信jssdk部署到我们的项目中。下面只需要在你的合适得控制器中调用即可,一般在基类中调用

 

 

 

 

 

最后在你的view视图中这样子调用,前提不要忘了引入weixinJS

wx.config({
   debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
   appId: '{fy_$signPackage.appId}', // 必填,公众号的唯一标识
   timestamp: '{fy_$signPackage.timestamp}', // 必填,生成签名的时间戳
   nonceStr: '{fy_$signPackage.nonceStr}', // 必填,生成签名的随机串
   signature: '{fy_$signPackage.signature}',// 必填,签名,见附录1
   jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function(){
   wx.ready(function () {
      // 1 判断当前版本是否支持指定 JS 接口,支持批量判断
      wx.checkJsApi({
         jsApiList: [
            'onMenuShareTimeline',
            'onMenuShareAppMessage'
         ],
      });
      var shareData = {
         title: '测试标题',
         desc: '测试描述',
         link: 'http://baidu.com',
         imgUrl: '/uploads/20161207/5848184c8ec68.jpg',
      };
      wx.onMenuShareAppMessage(shareData);
      wx.onMenuShareTimeline(shareData);
   });
})

 

mysql多表联查以及DISTINCT关键字的使用

首先说一下本示例中用到的数据结构(三张表):

-- ----------------------------
-- Table structure for test_department  部门表
-- ----------------------------
DROP TABLE IF EXISTS `test_department`;
CREATE TABLE `test_department` (
  `dep_id` int(11) NOT NULL,
  `dep_name` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_department
-- ----------------------------
INSERT INTO `test_department` VALUES ('1', '部门1');
INSERT INTO `test_department` VALUES ('2', '部门2');
INSERT INTO `test_department` VALUES ('3', '部门3');

-- ----------------------------
-- Table structure for test_group  分组表
-- ----------------------------
DROP TABLE IF EXISTS `test_group`;
CREATE TABLE `test_group` (
  `gro_id` int(11) NOT NULL,
  `gro_name` varchar(50) NOT NULL,
  `gro_dep` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_group
-- ----------------------------
INSERT INTO `test_group` VALUES ('1', '小组1', '1');
INSERT INTO `test_group` VALUES ('2', '小组2', '2');
INSERT INTO `test_group` VALUES ('3', '小组3', '3');

-- ----------------------------
-- Table structure for test_student  学生表
-- ----------------------------
DROP TABLE IF EXISTS `test_student`;
CREATE TABLE `test_student` (
  `stu_id` int(11) NOT NULL,
  `stu_name` varchar(50) NOT NULL,
  `stu_group` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of test_student
-- ----------------------------
INSERT INTO `test_student` VALUES ('1', '张三', '1');
INSERT INTO `test_student` VALUES ('2', '李四', '2');
INSERT INTO `test_student` VALUES ('3', '王五', '3');

现在想要得到这样的数据:

查询每个部门中分组的数量 学生的数量,以部门分组进行查询

首先我们查询语句应该这样子写

select d.dep_id,d.dep_name,count(g.gro_id),count(s.stu_id)
from test_department d
left join test_group g on d.dep_id=g.gro_dep
left join test_student s on s.stu_group=g.gro_id
group by(d.dep_id)

然后得到的结果是:

 

 

 

 

 

 

看图中查询结果没有错,一共有三个部门,每个部门有一个分组,一个分组对应一个学生。

其实这个查询语句中有隐藏的错误,当我们把数据这样子修改一下时:

INSERT INTO `test_student` VALUES ('1', '张三', '1');
INSERT INTO `test_student` VALUES ('2', '李四', '1');
INSERT INTO `test_student` VALUES ('3', '王五', '1');

这个时候我们理想中得到的结果应该是

一共是三个部门,每个部门有一个分组,其中一分组有学生三个,其他学生分组为0

可是我们得到的结果却是:

 

 

 

 

 

 

 

明明一个部门有三个分组,怎么一部门直接有三个三组了呢。

 

其实问题的原因在于,这个时候查询语句是三表联查,count在统计行数时,把left join test_student的行数也统计了进去

这个时候我们就应该使用DISTINCT关键字来进行查询了,

select d.dep_id,d.dep_name,count(DISTINCT g.gro_id),count(DISTINCT s.stu_id)
from test_department d
left join test_group g on d.dep_id=g.gro_dep
left join test_student s on s.stu_group=g.gro_id

group by(d.dep_id)

 

 

 

 

 

 

这个时候得到到的数据就和我们想象中的一样了,

DISTINCT的用法其一就是过滤掉多余的重复记录只保留一条

其他具体用法等碰到的时候在做解释。