当前位置: 首页 > news >正文

2022恢复线下教学通知班级优化大师官网下载

2022恢复线下教学通知,班级优化大师官网下载,互联网怎么打广告推广,携程网站建设进度及实施过程文章目录 一. char字符串类型二. varchar字符串类型2.1 char和varchar比较 三. 日期和时间类型四. enum和set类型4.1 set的查询 结束语 一. char字符串类型 char (L) 固定长度字符串 L是可以存储的长度,单位是字符,最大长度是255 MySQL中的字符&#xff…

文章目录

  • 一. char字符串类型
  • 二. varchar字符串类型
    • 2.1 char和varchar比较
  • 三. 日期和时间类型
  • 四. enum和set类型
    • 4.1 set的查询
  • 结束语

在这里插入图片描述

一. char字符串类型

char (L) 固定长度字符串
L是可以存储的长度,单位是字符,最大长度是255

MySQL中的字符,和C/C++,Java的有所不同
我们认为的字符,是一个字节,但在MySQL中字符就是字符
我们做如下实验

mysql> create table char_test(-> id int,-> name char(2)-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into char_test values (1,'ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into char_test values (1,'abc');
ERROR 1406 (22001): Data too long for column 'name' at row 1mysql> insert into char_test values (1,'中国');
Query OK, 1 row affected (0.00 sec)mysql> insert into char_test values (1,'中国人');
ERROR 1406 (22001): Data too long for column 'name' at row 1

虽然汉字在utf8中占用3个字节,在gbk中占用2个字节,但是在char(2)中,中国也可以成功插入

二. varchar字符串类型

varchar(L) 可变长度字符串
L表示字符长度,最大长度为65535字节

mysql> create table varchar_test(-> id int,-> ch varchar(6)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into varchar_test values (1,'hello');
Query OK, 1 row affected (0.00 sec)mysql> insert into varchar_test values (1,'我爱你,中国');
Query OK, 1 row affected (0.00 sec)

对于varchar(len),len的最大值与表的编码密切相关

len表示最大字符个数,varchar最大存储65535个字节。但是varchar的前1~3个字节需要用于记录数据大小。所以最大字节数是65532。
如果是utf8编码,一个字符占用3个字节,那么len最大是21844
如果是gbk,一个字符占用2个字节,那么len最大是32766

在创建表时,默认大小是不算记录数据长度的字节数的
实验如下:

mysql> create table varchar_test2( name varchar(21844) );
Query OK, 0 rows affected (0.02 sec)mysql> create table varchar_test3( name varchar(21845) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

还需注意,MySQL一行数据也有限制长度,即所有属性字节总数之和有最大值

mysql> create table varchar_test4( id int,name varchar(21844) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

2.1 char和varchar比较

varchar是变长字符串,char是固定字符串

在这里插入图片描述
如果字符长度远小于len,那么varchar只有占用插入数据的长度,而char是固定len长度

如何选择varchar或者char

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号
  • 如果数据长度有变化,就使用变长(varchar),比如:名字,地址
  • 定长的磁盘空间比较浪费,但是效率高,不用扩容,维护数据长度
  • 变长的磁盘空间比较节省,但是效率低
  • 定长的意义是,直接开辟号对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

三. 日期和时间类型

常用的日期有如下三个

  • date:日期 格式:yyyy-mm-dd 占用三个字节
  • datetime: 时间日期 格式:yyyy-mm-dd HH:ii:ss 年份表示范围从1000~9999,占用八个字节
  • timestamp:时间戳,从1970年开始 格式:yyyy-mm0dd HH:ii:ss 与datetime完全一致,占用四个字节
//创建表
mysql> create table date_test(-> date1 date,-> date2 datetime,-> date3 timestamp-> );
Query OK, 0 rows affected (0.03 sec)//显示表的信息
mysql> desc date_test;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| date1 | date      | YES  |     | NULL              |                             |
| date2 | datetime  | YES  |     | NULL              |                             |
| date3 | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)

需要注意的是,timestamp时间戳,不允许为空,并且有默认值

//插入数据
mysql> insert into date_test (date1,date2)  values ('2000-10-01','2003-12-01 14:00:00');
Query OK, 1 row affected (0.00 sec)mysql> select * from date_test;
+------------+---------------------+---------------------+
| date1      | date2               | date3               |
+------------+---------------------+---------------------+
| 2000-10-01 | 2003-12-01 14:00:00 | 2023-09-28 11:46:55 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

添加数据时,时间戳自动补上当前时间

on update CURRENT_TIMESTAMP表示在修改时,时间戳会自动更新为当前时间

mysql> update date_test set date1='2002-10-01';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from date_test;
+------------+---------------------+---------------------+
| date1      | date2               | date3               |
+------------+---------------------+---------------------+
| 2002-10-01 | 2003-12-01 14:00:00 | 2023-09-28 11:51:00 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

四. enum和set类型

enum是枚举类型,选项可以是多个,但插入数据时只能选择其中一个
enum('选项一',‘选项二’,'选项三'...)

set是集合类型,选项可以是多个,插入数据也可以是多个
set('选项一','选项二','选项三'...)

//创建如下表
mysql> create table person(-> name varchar(8),-> gender enum('男','女'),-> hobby set('篮球','足球','音乐','羽毛球','游泳')-> );+--------+-------------------------------------------------+------+-----+-------+-----+
| Field  | Type                                         | Null | Key | Default | Extra |
+--------+-------------------------------------------------+------+-----+---- --+-----+
| name   | varchar(8)                                   | YES  |     | NULL    |       |
| gender | enum('男','女')                               | YES  |     | NULL    |       |
| hobby  | set('篮球','足球','音乐','羽毛球','游泳')        | YES  |     | NULL    |       |
+--------+-------------------------------------------------+------+-----+-------+-----+

enum类型在插入数据时,只能选择其中一个插入,且也只能选择选项有的数据

mysql> insert into person values ('张三','男','篮球');
Query OK, 1 row affected (0.01 sec)mysql> insert into person values ('张三','男,女','篮球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> insert into person values ('张三','沃尔玛购物袋','篮球');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1

同时,enum类型支持按下标插入,注意下标从1开始

mysql> insert into person values ('李铁柱',1,'篮球');
Query OK, 1 row affected (0.00 sec)mysql> insert into person values ('田二妞',2,'游泳');
Query OK, 1 row affected (0.00 sec)mysql> select * from person;
+-----------+--------+--------+
| name      | gender | hobby  |
+-----------+--------+--------+
| 张三      || 篮球   |
| 李铁柱    || 篮球   |
| 田二妞    || 游泳   |
+-----------+--------+--------+

set类型在插入数据时,可以选择多个

mysql> insert into person values ('李四','男','篮球,音乐,羽毛球');
Query OK, 1 row affected (0.01 sec)

set类型也支持使用数字插入,但是不同于enum的下标,set使用比特位插入
hobby有五个选项,即00000,哪一位为1,代表插入哪一位的数据

set('篮球','足球','音乐','羽毛球','游泳')
mysql> insert into person values ('王五','男',3);
mysql> insert into person values ('赵六','男',7);
mysql> insert into person values ('孙七','女',31);王五       || 篮球,足球                          |
| 赵六      || 篮球,足球,音乐                      |
| 孙七      || 篮球,足球,音乐,羽毛球,游泳            |

3 --> 00011;7 --> 00111;31 --> 11111

4.1 set的查询

当前表数据如下:

+-----------+--------+---------------------------------------+
| name      | gender | hobby                                 |
+-----------+--------+---------------------------------------+
| 张三      || 篮球                                    |
| 李铁柱    || 篮球                                    |
| 田二妞    || 游泳                                    |
| 李四      || 篮球,音乐,羽毛球                          |
| 王五      || 篮球,足球                                |
| 赵六      || 篮球,足球,音乐                           |
| 孙七      || 篮球,足球,音乐,羽毛球,游泳                 |
+-----------+--------+---------------------------------------+

如果我们想查询有哪些人的爱好是篮球

mysql> select * from person where hobby='篮球';
+-----------+--------+--------+
| name      | gender | hobby  |
+-----------+--------+--------+
| 张三      || 篮球   |
| 李铁柱    || 篮球   |
+-----------+--------+--------+

虽然有查到,但是显示的是hobby只有篮球的。
如果我们想要查找hobby里有篮球的人,如何查询呢?

我们需要使用find_in_set函数

find_in_set(sub,str_list)在str_list中查找sub。注意sub只能是单个数据

比如:

mysql> select find_in_set('b','a,b,c');
+--------------------------+
| find_in_set('b','a,b,c') |
+--------------------------+
|                        2 |
+--------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,b','a,b,c');
+----------------------------+
| find_in_set('a,b','a,b,c') |
+----------------------------+
|                          0 |
+----------------------------+
1 row in set (0.00 sec)

find_in_set函数返回的是sub在str_list中的下标,从1开始,不存在返回0
运用在集合查询中是这样的

//查询一个
//含有足球
mysql> select * from person where find_in_set('足球',hobby);
+--------+--------+---------------------------------------+
| name   | gender | hobby                                 |
+--------+--------+---------------------------------------+
| 王五   || 篮球,足球                             |
| 赵六   || 篮球,足球,音乐                        |
| 孙七   || 篮球,足球,音乐,羽毛球,游泳            |
+--------+--------+---------------------------------------+//查询多个
//既含有足球,又含有羽毛球
mysql> select * from person where find_in_set('足球',hobby) and find_in_set('羽毛球',hobby);
+--------+--------+---------------------------------------+
| name   | gender | hobby                                 |
+--------+--------+---------------------------------------+
| 孙七   || 篮球,足球,音乐,羽毛球,游泳            |
+--------+--------+---------------------------------------+
1 row in set (0.00 sec)

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

http://www.hkea.cn/news/758949/

相关文章:

  • 网络营销网站策划个人网站seo入门
  • 云南省网站备案要求全渠道营销的概念
  • 装修网站合作平台有哪些torrentkitty磁力猫
  • 大理网站开发长春seo结算
  • 西双版纳疫情最新情况seo营销的概念
  • 网站推广seo蜘蛛屯优化排名模板建网站价格
  • 怎样建设公司网站小程序b2b网站大全免费
  • 百度抓取不到网站百度识图搜索图片来源
  • 企业网站栏目规划的重要性网络营销的概述
  • 公司网站建设找谁做免费发布推广信息网站
  • 虚拟币网站开发seo百度关键字优化
  • 网站建设都 包括哪些淄博网站制作
  • 自己做装修网站南宁百度推广seo
  • 品牌建设浅谈seo网络营销外包
  • 昆山网站建设兼职千锋教育的官网
  • cm域名做网站盘古百晋广告营销是干嘛
  • 网站栏目策划企业网络营销方案
  • 网站自动采集指标sem广告投放是做什么的
  • 想做一个个人网站怎么做培训学校
  • 网站开发ipv6升级如何创建自己的小程序
  • 做网站需要备案吗外贸网站推广与优化
  • 独立网站建设流程b站视频推广网站动漫
  • 泰安诚信的网站建设b站推广入口2023年
  • 高校网站建设资料库东莞seo推广公司
  • 电子印章手机在线制作软件四川seo整站优化费用
  • 个人风采网站制作外贸网站平台哪个好
  • 沈阳企业建站谷歌推广和seo
  • .la域名做的网站如何快速推广app
  • 广州优化网站建设怎么用手机制作网站
  • 做微网站的第三方学网络营销