标签 mysql 下的文章

mysql数据类型学习

整型
整型用来存放整数,根据可以存放的数字大小又分为TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,每种类型又分为无符号(UNSIGNED)和有符号,
创建一个表,并插入数据,int后面括号里面的数字并不是限制了可存放的数字的大小,而是在查询结果输出的时候会改变输出的格式,方便查看,并且在设置了zerofill的时候才会生效

create table `int_table` (`int1` int,`int2` int(3),`int3` int(3) zerofill)engine=MYISAM;
insert into int_table values (1,1,1),(2,2,2),(8,8,8),(11,11,11);

结果

+------+------+------+
| int1 | int2 | int3 |
+------+------+------+
|    1 |    1 |  001 |
|    2 |    2 |  002 |
|    8 |    8 |  008 |
|   11 |   11 |  011 |
+------+------+------+

浮点型
用来存放小数,根据数据范围的大小可分为FLOAT、DOUBLE 和 DECIMAL,和整型一样 UNSIGNED 和 ZEROFILL 也可以作用于浮点型
FLOAT 数值类型用于表示单精度浮点数值,而 DOUBLE 数值类型用于表示双精度浮点数值。
与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过 7 位数字,小数点后面带有 3 位数字。
对于小数点后面的位数超过允许范围的值,MySQL 会自动将它四舍五入为最接近它的值,再插入它

create table `float_t` (`f1` float,`f2` float(5,2),`f3` float(7,2) zerofill)engine=MYISAM;
insert into `float_t` values (1.1,1.1,1.1),(2.222,2.222,2.222),(5.555,5.555,5.555),(1.16666,1.16666,1.166666);
select * from float_t;
+---------+------+---------+
| f1      | f2   | f3      |
+---------+------+---------+
|     1.1 | 1.10 | 0001.10 |
|   2.222 | 2.22 | 0002.22 |
|   5.555 | 5.55 | 0005.55 |
| 1.16666 | 1.17 | 0001.17 |
+---------+------+---------+

日期类型
year 类型
插入数据时,注意带上引号的数据有什么不同

create table `year_t` (`y1` year(4),`y2` year(2));
insert into year_t values (16,16),(2016,2016),(0,0),('0','0');
select * from year_t;
+------+------+
| y1   | y2   |
+------+------+
| 2016 | 2016 |
| 2016 | 2016 |
| 0000 | 0000 |
| 2000 | 2000 |
+------+------+

time 类型
空格前的数字代表天数

create table `time_t` (`t1` time);
insert into `time_t` values ('01:01:01'),(020202),('030303'),(0404),('0505'),('6 06:06'),('7 07');
select * from time_t;
+-----------+
| t1        |
+-----------+
| 01:01:01  |
| 02:02:02  |
| 03:03:03  |
| 00:04:04  |
| 00:05:05  |
| 150:06:00 |
| 175:00:00 |
+-----------+

date类型

create table `date_t` (`d1` date);
insert into `date_t` values ('2016-08-08'),('16-09-09');
select * from `date_t`;
+------------+
| d1         |
+------------+
| 2016-08-08 |
| 2016-09-09 |
+------------+

datetime 类型

create table `datatime_t` (`d1` datetime);
insert into `datatime_t` values ('2016-01-01'),('2016-02-02 02:02:02'),('16-03-03 03:03:03'),('16*04*04 04:04:04');
select * from `datatime_t`;
+---------------------+
| d1                  |
+---------------------+
| 2016-01-01 00:00:00 |
| 2016-02-02 02:02:02 |
| 2016-03-03 03:03:03 |
| 2016-04-04 04:04:04 |
+---------------------+

timestamp 类型
会随着系统时区的变化而变化

create table `timestamp_t` (`t1` timestamp);
insert into `timestamp_t` values (now());
show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+
select * from `timestamp_t`;
+---------------------+
| t1                  |
+---------------------+
| 2016-09-21 15:21:33 |
+---------------------+
set time_zone='+10:00';
show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +10:00 |
+---------------+--------+
select * from `timestamp_t`;
+---------------------+
| t1                  |
+---------------------+
| 2016-09-21 17:21:33 |
+---------------------+

字符串类型
字符串里面类型很多,就记录下其中的几个
char : 固定长度
varchar : 可变长度
从以下的sql看区别

create table `char_t` (`c1` char(6),`c2` varchar(6));
insert into char_t values ('abc   ','abc   ');
select *,concat(c1,'!'),concat(c2,'!'),length(c1),length(c2) from char_t;
+------+--------+----------------+----------------+------------+------------+
| c1   | c2     | concat(c1,'!') | concat(c2,'!') | length(c1) | length(c2) |
+------+--------+----------------+----------------+------------+------------+
| abc  | abc    | abc!           | abc   !        |          3 |          6 |
+------+--------+----------------+----------------+------------+------------+

mysql本机登录不上

报这个错
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

在 my.cnf 最后加上一行,这个是在启动时不启用授权表

skip-grant-tables

重启 mysql ,登录进mysql,再修改相关的权限信息,使之可以登录,在去掉这个参数就可以,重启mysql就行了

mysql架构学习

服务层:为客户端请求做连接处理,授权认证,安全等
完成线程的管理(线程缓冲池)

核心层:查询解析,分析,优化,缓存,所有内建函数,存储过程,触发器,视图等

查询 -> 缓存 -> 有缓存 -> 返回结果
-> 没有缓存 -> 解析查询 -> 优化 -> 执行查询 -> 返回结果

存储引擎层:存储和提取数据以及事务处理

生成定制的 mysql的rpm 包

mysql 5.6
centos 6.8 minimal

下载 src.rpm 后缀的包
安装所需软件

yum install rpm-build

切换到普通用户

su - jin

创建rmpbuild目录

mkdir rembuild

解压rpm包文件

rpm -ivh MySQL-5.6.33-1.el6.src.rpm 

进入 rpmbuild 目录

vim SPECS/mysql.spec 

找到 Build full release ,在修改自定义的编译参数,这里以修改数据库支持的字符集为例,如下

${CMAKE} ../%{src_dir} -DBUILD_CONFIG=mysql_release -DINSTALL_LAYOUT=RPM \
           -DWITH_INNODB_MEMCACHED=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo \
           -DMYSQL_UNIX_ADDR="%{mysqldatadir}/mysql.sock" \
           -DFEATURE_SET="%{feature_set}" \
           %{ssl_option} \
           -DCOMPILATION_COMMENT="%{compilation_comment_release}" \
           -DMYSQL_SERVER_SUFFIX="%{server_suffix}"

改成下面的

${CMAKE} ../%{src_dir} -DBUILD_CONFIG=mysql_release -DINSTALL_LAYOUT=RPM \
           -DWITH_INNODB_MEMCACHED=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo \
           -DMYSQL_UNIX_ADDR="%{mysqldatadir}/mysql.sock" \
           -DFEATURE_SET="%{feature_set}" \
           %{ssl_option} \
           -DCOMPILATION_COMMENT="%{compilation_comment_release}" \
           -DMYSQL_SERVER_SUFFIX="%{server_suffix}" \
           -DWITH_EXTRA_CHARSETS=all

或者直接修改最上面变量声明的位置,这里以修改运行用户为例,

%global mysqld_user     mysql

修改为

%global mysqld_user     mysql1

构建 rpm 包

cd SPECS/
rpmbuild -bb mysql.spec

报错了

gperf is needed by MySQL-5.6.33-1.linux_glibc.x86_64
    time is needed by MySQL-5.6.33-1.linux_glibc.x86_64
    zlib-devel is needed by MySQL-5.6.33-1.linux_glibc.x86_64

缺什么安装即可

sudo yum install -y gperf time zlib-devel

重新构建

rpmbuild -bb mysql.spec

报错

CMake Error at cmake/build_configurations/mysql_release.cmake:46 (MESSAGE):


          aio is required on Linux, you need to install the required library:



            Debian/Ubuntu:              apt-get install libaio-dev
            RedHat/Fedora/Oracle Linux: yum install libaio-devel
            SuSE:                       zypper install libaio-devel



          If you really do not want it, pass -DIGNORE_AIO_CHECK to cmake.

Call Stack (most recent call first):
  CMakeLists.txt:134 (INCLUDE)

按照提示执行即可

sudo yum install libaio-devel

重新构建

rpmbuild -bb mysql.spec

报了个这个错

-DWITH_EXTRA_CHARSETS=all: command not found

犯二了,加的选项没加 \

重新构建

rpmbuild -bb mysql.spec

出现以下的,就ok了

Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-server-5.6.33-1.linux_glibc.x86_64.rpm
Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-client-5.6.33-1.linux_glibc.x86_64.rpm
Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-test-5.6.33-1.linux_glibc.x86_64.rpm
Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-devel-5.6.33-1.linux_glibc.x86_64.rpm
Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-shared-5.6.33-1.linux_glibc.x86_64.rpm
Wrote: /home/jin/rpmbuild/RPMS/x86_64/MySQL-embedded-5.6.33-1.linux_glibc.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.0k7Cbk
+ umask 022
+ cd /home/jin/rpmbuild/BUILD
+ cd mysql-5.6.33
+ '[' /home/jin/rpmbuild/BUILDROOT/MySQL-5.6.33-1.linux_glibc.x86_64 '!=' / ']'
+ '[' -d /home/jin/rpmbuild/BUILDROOT/MySQL-5.6.33-1.linux_glibc.x86_64 ']'
+ rm -rf /home/jin/rpmbuild/BUILDROOT/MySQL-5.6.33-1.linux_glibc.x86_64
+ exit 0

测试能否安装

yum install MySQL-server-5.6.33-1.linux_glibc.x86_64.rpm

报错

file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.6.33-1.linux_glibc.x86_64 conflicts with file from package mysql-libs-5.1.73-7.el6.x86_64

是已经安装的 mysql-libs 的版本太低,先删除,在安装

yum remove mysql-libs
yum install MySQL-server-5.6.33-1.linux_glibc.x86_64.rpm

复制配置文件

scp /usr/share/mysql/my-default.cnf /etc/my.cnf

因为在生成 rpm 包的时候,把默认的用户和用户组改成了 mysql1 , 所以在 yum 安装的时候创建了 mysql 的用户,直接启动的时候还是会以 mysql 的身份启动,所以在 my.cnf 中手动指定下 用户

[mysqld]

下加一行

user=mysql1

启动

service mysql start

看到下面的就 ok 了

Starting MySQL.. SUCCESS!

安装客户端

yum install MySQL-client-5.6.33-1.linux_glibc.x86_64.rpm

在这里查看默认密码

cat /root/.mysql_secret

登录,登录之后需要修改密码才能做其他操作

mysql -u root -p 

设置密码

SET PASSWORD = PASSWORD('123456'); 

允许远程登录

update user set password=password('123456') where user='root';
update user set host='%' where user='root' and host='localhost';
flush privileges;

mysql5.6 编译安装

先关闭selinux
编译需要的软件

yum install gcc-c++
yum install gcc
yum install cmake

添加mysql运行的用户

useradd mysql -s /sbin/nologin

创建mysql数据目录

mkdir mysql
cd mysql
mkdir data
chown -R mysql:mysql mysql

编译

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/var/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.socket  \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

5.7,编译(5.7需要下载一个库(boots),我这下载特别慢,就不装5.7了)

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/var/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysqld.socket \ 
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/boost

DCMAKE_INSTALL_PREFIX : 执行文件路径
DMYSQL_DATADIR : 数据存放地址
DSYSCONFDIR : 配置文件目录
WITH_ARCHIVE_STORAGE_ENGINE : 存储引擎
WITH_BLACKHOLE_STORAGE_ENGINE : 存储引擎
WITH_PERFSCHEMA_STORAGE_ENGINE : 存储引擎(分区)
MYSQL_UNIX_ADDR : socket文件路径
ENABLED_LOCAL_INFILE : 是否能使用本地文件
WITH_EXTRA_CHARSETS : 支持的字符集
MYSQL_USER : 运行时的用户

报了下面的错,安装 ncurses-devel 即可

-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH) 
CMake Error at cmake/readline.cmake:85 (MESSAGE):
  Curses library not found.  Please install appropriate package,
yum install -y ncurses-devel

清空下文件,不然还会报错

echo "" > CMakeLists.txt
\rm CMakeCache.txt

再执行

cmake

显示

-- Configuring done
-- Generating done

即可
报了个警告(不知道有没有影响。。。把 MYSQL_USER 这个选项去掉好像就没有影响了,我没去掉,编译安装之后是正常的)

Manually-specified variables were not used by the project:
MYSQL_USER

显示 100% 即可

gmake

安装

make install

文件移动到该目录,就能被 service 管理

cp support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql

配置文件

cp support-files/my-default.cnf /etc/my.cnf

[mysqld] 添加:

datadir=/var/mysql/data
#default-storage-engine=MyISAM
# 以下可选:
log-error = /var/mysql/data/error.log
#pid-file = /var/mysql/mysql.pid
user = mysql
tmpdir = /tmp

安装默认数据表

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/var/mysql/data --user=mysql

开启启动

chkconfig --add mysql