可是开掘某一天尚未多少,每个数据类型都有友

2019-07-16 作者:数据库   |   浏览(57)

将mssql数据库高版本迁移到低版本

  1. 在低版本目标数据库中创建目标空数据库[TargetDb] ,注意新建数据库即可,不要创建任何表
  2. 在低版本数据库中,选中[服务器对象=>链接服务器] 右键[新建链接服务器]
  3. 填入链接服务器IP 端口
  4. 选SQL Server ;PS:貌似其他数据库也可以,这里不做展开,也没验证过
  5. 选择安全性,使用此安全上下文建立链接;敲入账号密码,点确定
  6. 这个时候,在SSMS中的资源管理器窗口就会发现新增的链接服务器,没看见的刷新
  7. 编写一个SQL 语句 PS:貌似其他数据库也可以,这里不做展开,也没验证过

    select *  from [链接服务器IP].[来源数据库名称].dbo.[来源数据库表]
    
  8. 在高版本数据库中查询所有表数据,并且形成查询插入语句,如下:

    SELECT 'select * into [目标数据库名称].dbo.' Name ' from [链接服务器IP].[来源数据库名称].dbo.' Name ';' FROM SysObjects Where XType='U' ORDER BY Name
    
  9. 生成一系列查询插入语句

  10.  去目标数据库执行
  11. 搞定

介绍

存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的

详细参考链接:

mysql常用数据类型概括:

图片 1

#1. 数字:
    整型:tinyinit  int  bigint
    小数:
        float :在位数比较短的情况下不精准
        double :在位数比较长的情况下不精准
            0.000001230123123123
            存成:0.000001230000

        decimal:(如果用小数,则用推荐使用decimal)
            精准
            内部原理是以字符串形式去存

#2. 字符串:
    char(10):简单粗暴,浪费空间,存取速度快
            root存成root000000
    varchar:精准,节省空间,存取速度慢

    sql优化:创建表时,定长的类型往前放,变长的往后放
                    比如性别           比如地址或描述信息

    >255个字符,超了就把文件路径存放到数据库中。
            比如图片,视频等找一个文件服务器,数据库中只存路径或url。


#3. 时间类型:
    最常用:datetime


#4. 枚举类型与集合类型

图片 2

 

一.概述

         由于服务器生成的二进制日志文件以二进制格式保存,所以如果要想检查这些文件的文本格式,就会用到mysqlbinlog日志管理工具。
    mysqlbinlog的语法如下:
    mysqlbinlog [options] log-files log-files2...

    其中options有很多选项,常用如下:

选项

说明

-d, --database=name

指定数据库名称,只列出指定的数据库相关操作。

-o, --offset=#

忽略掉日志中的前n行命令

-r, --result-file=name

将输出的文本格式日志输出到指定文件

-s,--short-form

显示简单格式,省略掉一些信息

--set--charset=char-name

在输出为文本格式时,在文件第一行加上set names char-name.

-- start-datetime=name-stop-datetime=name

指定日期间隔内的所有日志

--start-position=# --stop-position=#

指定位置间隔内的所有日志

  1.1 开启binlog日志

    默认情况下是未打开binlog日志,可以通过以下二种方式查看:

mysql> show binary logs;
ERROR 1381 (HY000): You are not using binary logging
--或者这样查看
mysql> show variables like '%log_bin%    

    图片 3

  开启binlog日志,修改my.cnf文件重启mysql服务,如下所示:
    图片 4
   再次查询binlog日志状态:
    图片 5
    图片 6

问题描述

查询数据库表中最近7天的记录

select count(*),date(create_time) as date from task where datediff(now(),create_time)<=6  group by day(create_time); 

 

但是发现某一天没有数据,结果中没有显示当天(2017-08-28)的数据

图片 7

一、数值类型

整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT

作用:存储年龄,等级,id,各种号码等

图片 8图片 9

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                -128 ~ 127
            无符号:
                0 ~ 255

            PS: MySQL中无布尔值,使用tinyint(1)构造。



========================================
        int[(m)][unsigned][zerofill]

            整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -2147483648 ~ 2147483647
            无符号:
                    0 ~ 4294967295



========================================
        bigint[(m)][unsigned][zerofill]
            大整数,数据类型用于保存一些范围的整数数值范围:
            有符号:
                    -9223372036854775808 ~ 9223372036854775807
            无符号:
                    0  ~  18446744073709551615

View Code

 

验证1:有符号和无符号tinyint

图片 10

============有符号tinyint==============
# 创建数据库db4
create database db4 charset utf8;

# 切换到当前db4数据库
mysql> use db4;

# 创建t1 规定x字段为tinyint数据类型(默认是有符号的)
mysql> create table t1(x tinyint);

# 验证,插入-1这个数
mysql>   insert into t1 values(-1);

# 查询 表记录,查询成功(证明默认是有符号类型)
mysql> select * from t1;
 ------ 
| x    |
 ------ 
| -1 |
 ------ 

#执行如下操作,会发现报错。因为有符号范围在(-128,127)
mysql>   insert into t1 values(-129),(128);
ERROR 1264 (22003): Out of range value for column 'x' at row 1


============无符号tinyint==============
# 创建表时定义记录的字符为无符号类型(0,255) ,使用unsigned
mysql> create table t2(x tinyint unsigned);

# 报错,超出范围
mysql>   insert into t2 values(-129);
ERROR 1264 (22003): Out of range value for column 'x' at row 1

# 插入成功
mysql>   insert into t2 values(255);
Query OK, 1 row affected (0.00 sec)

图片 11

 

验证2:int类型后面的存储是显示宽度,而不是存储宽度

图片 12

mysql> create table t3(id int(1) unsigned);

#插入255555记录也是可以的
mysql> insert into t3 values(255555);

mysql> select * from t3;
 -------- 
| id     |
 -------- 
| 255555 |
 -------- 
ps:以上操作还不能够验证,再来一张表验证用zerofill 用0填充

# zerofill 用0填充
mysql> create table t4(id int(5) unsigned zerofill);


mysql> insert into t4 value(1);
Query OK, 1 row affected (0.00 sec)

#插入的记录是1,但是显示的宽度是00001
mysql> select * from t4;
 ------- 
| id    |
 ------- 
| 00001 |
 ------- 
1 row in set (0.00 sec)

图片 13

 

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下

其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了

默认的显示宽度,都是在最大值的基础上加1

图片 14

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

 

二. 使用mysqlbinlog查看日志

--先在test表中插入一条数据退出。
mysql> insert into a values('testbinlog');

-- 查看binlog位置
[root@hsr mysql]# cd /var/lib/mysql
[root@hsr mysql]# ls
mysql-bin.000001  mysql-bin.index    

   2.1 使用mysqlbinlog查看日志 不加任何options参数

[root@hsr ~]# cd /usr/local/mysql/bin
[root@hsr bin]# ./mysqlbinlog /var/lib/mysql/mysql-bin.000001    

    图片 15

        上面的日志文件除了创建表和删除表的sql外,操作数据库的语句都加密了。

  2.2 使用参数"--base64-output=decode-row -v"查看具体的sql语句,如下命令

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001

    图片 16
    上图中 at 291是插入语句的开始位置, at 384是插入语句的结束位置。如果后续该表数据丢失,可以根据这两个地方执行恢复。也可以根据开始时间和结束时间来恢复,后面再讲日志时具体介绍。

  2.3  加-d选项,将只显示对test数据库的操作日志

                   [root@hsr bin]# ./mysqlbinlog   /var/lib/mysql/mysql-bin.000001 -d test

  2.4  加-o选项, 忽略掉日志中的前n个操作。演示下

-- 插入三条数据
INSERT INTO a VALUES('testbinlog2')
INSERT INTO a VALUES('testbinlog3')
INSERT INTO a VALUES('testbinlog4')

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001 -d test  -o 14

    图片 17
    上图显示日志生成后,从at 898行开始显示。 14个操作代表:日志显示跳过14个at。
  2.5 加-r选项
    将输出的文本格式日志输出到指定文件,下面将文件结果输出到文件resultfile中。

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001 -r resultfile
[root@hsr bin]# more resultfile

    图片 18
图片 19

  2.6 加-s 将内容进行简单显示

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001 -s

  图片 20

    如上图所示,简单显示后,没有了详细的sql语句。
  2.7 加"--start-datetime--stop-datetime"显示9:00 ~12:00之间的日志

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001  
--start-datetime='2018/08/30 09:00:00' --stop-datetime='2018/08/30 12:00:00'

   图片 21
    如上图所示:最后显示的时间截是1535600091, 转换后是2018-08-30 11:34:51。 开始和结束日期可以只写一个。
  2.8 加"--start-position=#和--stop-position=#" 和日期范围类似,不过更精确

[root@hsr bin]# ./mysqlbinlog --base64-output=decode-row -v  /var/lib/mysql/mysql-bin.000001  --start-position=944

    图片 22
  最后官网文档 mysqlbinlog   

解决思路

  1. 思路一: 可以在自己的程序中做额外的补零处理

  2. 思路二: 构建一个最近七天的结果集,然后和查询的结果集合做left join(本文采用第二种方式)

select a.click_date,b.count
from (
    SELECT curdate() as click_date
    union all
    SELECT date_sub(curdate(), interval 1 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 2 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 3 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 4 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 5 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 6 day) as click_date
) a left join (
  select date(create_time) as datetime, count(*) as count
  from arms_task
  group by date(create_time)
) b on a.click_date = b.datetime;

当天2017-08-28结果显示为NULL

图片 23

需要把NULL设置为0,利用ifnull函数即可

select a.click_date,ifnull(b.count,0) as count
from (
    SELECT curdate() as click_date
    union all
    SELECT date_sub(curdate(), interval 1 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 2 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 3 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 4 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 5 day) as click_date
    union all
    SELECT date_sub(curdate(), interval 6 day) as click_date
) a left join (
  select date(create_time) as datetime, count(*) as count
  from arms_task
  group by date(create_time)
) b on a.click_date = b.datetime;

 

图片 24

本文由小鱼儿玄机30码发布于数据库,转载请注明出处:可是开掘某一天尚未多少,每个数据类型都有友

关键词: 小鱼儿玄机30码