MySQL 字符类型
字符类型
   MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用char和varchar即可
| 类型 | 大小 | 用途 | 
|---|---|---|
| CHAR | 0-255字节 | 定长字符串 | 
| VARCHAR | 0-65535 字节 | 变长字符串 | 
| TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 | 
| TINYTEXT | 0-255字节 | 短文本字符串 | 
| BLOB | 0-65 535字节 | 二进制形式的长文本数据 | 
| TEXT | 0-65 535字节 | 长文本数据 | 
| MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 | 
| MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 | 
| LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 | 
| LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 | 
基本定义
对于字符类型而言,其指定宽度均为存入宽度,以字符为单位。
create table temp(
        ch char(5) not null, # 最多5个字符
        vc varcha(5) not null # 最多5个字符
);
定长变长
区别差异
   char是定长字符串,当存入的字符数量不足指定宽度时,将会使用进行填充。
   varchar是变长字符串,当存入的字符数类不足指定宽度时,不会使用任何字符进行填充。
通常情况下来讲,
char的存取速度要比varchar要高(约50%),但是更加浪费磁盘空间。在
InnoDB存储引擎中,不存在这种差异。

#官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
#注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定长,简单粗暴,浪费空间,存取速度快
字符长度范围:-(一个中文是一个字符,是utf8编码的3个字节)
存储:
存储char类型的值时,会往右填充空格来满足长度
例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储 检索:
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';) #varchar类型:变长,精准,节省空间,存取速度慢
字符长度范围:-(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit **8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit **16最大表示的数字为65535) 检索:
尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
差异详解
| Value | CHAR(4) | 
Storage Required | VARCHAR(4) | 
Storage Required | 
|---|---|---|---|---|
'' | 
' ' | 
4 bytes | '' | 
1 byte | 
'ab' | 
'ab ' | 
4 bytes | 'ab' | 
3 bytes | 
'abcd' | 
'abcd' | 
4 bytes | 'abcd' | 
5 bytes | 
'abcdefgh' | 
'abcd' | 
4 bytes | 'abcd' | 
5 bytes | 
| 
 由于 即存入  | 
||||
差异对比
如果要想进定长与变长的差异对比试验,需要用到以下两个函数。
length():查看字节数 char_length():查看字符数
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';  # 必须修改模式,使其查看定长字符类型时不会将填充空格移除。
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table ch(  # 创建定长字符类型的数据表,最大字符数为5字符
    ->         name char(5) not null
    -> );
Query OK, 0 rows affected (0.05 sec)
mysql> create table vc(  # 创建变长字符类型的数据表,最大字符数为5字符
    ->         name varchar(5) not null
    -> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into  ch(name) values("ab");  # 插入2字符的数据
Query OK, 1 row affected (0.01 sec)
mysql> select char_length(name) from ch;  # 可以看到这里的字符数为5,默认填充了3个空白字符
+-------------------+
| char_length(name) |
+-------------------+
|                 5 |
+-------------------+
1 row in set (0.00 sec)
mysql> insert into  vc(name) values("ab");  # 插入2字符的数据
Query OK, 1 row affected (0.00 sec)
mysql> select char_length(name) from vc;  # 字符数量依旧为2字符
+-------------------+
| char_length(name) |
+-------------------+
|                 2 |
+-------------------+
1 row in set (0.00 sec)
mysql>
   小总结:建议在同一张数据表中统一使用varchar或char类型,这里更推荐使用char类型。
常用函数
大小写转换
   upper()小写转大写,lower()大写转小写
mysql> select upper("mysql"),lower("MYSQL");
+----------------+----------------+
| upper("mysql") | lower("MYSQL") |
+----------------+----------------+
| MYSQL          | mysql          |
+----------------+----------------+
1 row in set (0.00 sec)
mysql>
指定量取
   left()与right()函数用于取左或右指定数量的字符
以下将示例取左边3个字符。
mysql> select left("一二三四五",3);
+----------------------+
| left("一二三四五",3) |
+----------------------+
| 一二三               |
+----------------------+
1 row in set (0.00 sec)
mysql>
中间字符
   mid()从中间取字符串,参数二为指定起始位置(从1开始),参数三为取的字符数量(可不指定,一直取完)。
以下将演示从第二个字符开始取两个。
mysql> select mid("一二三四五",2,2);
+-----------------------+
| mid("一二三四五",2,2) |
+-----------------------+
| 二三                  |
+-----------------------+
1 row in set (0.00 sec)
mysql>
截取子串
   substring()从指定起始位置开始取出向右所有字符串,可指定结束位置。(其实我感觉这个和mid()好像没啥区别)
mysql> select substring("一二三四五六七八九",1,4);
+-------------------------------------+
| substring("一二三四五六七八九",1,4) |
+-------------------------------------+
| 一二三四                            |
+-------------------------------------+
1 row in set (0.00 sec)
mysql>
字符长度
   char_length()可获取字符长度,如果要获取char类型的字符长度且包括填充空白符,需要修改sql模式。
   修改sql模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
mysql> select char_length("一二三四五六七八九");
+-----------------------------------+
| char_length("一二三四五六七八九") |
+-----------------------------------+
|                                 9 |
+-----------------------------------+
1 row in set (0.00 sec)
mysql>
字节长度
   length()可获取字节长度。
mysql> select length("一二三四五六七八九");
+------------------------------+
| length("一二三四五六七八九") |
+------------------------------+
|                           18 |
+------------------------------+
1 row in set (0.00 sec)
mysql>
字符连接
   concat()可将多段字符进行连接。
   以下示例将展示一二三四五,---以及12345这三段字符的连接。
mysql> select concat("一二三四五","---","12345");
+------------------------------------+
| concat("一二三四五","---","12345") |
+------------------------------------+
| 一二三四五---12345                 |
+------------------------------------+
1 row in set (0.00 sec)
mysql>
												
											MySQL 字符类型的更多相关文章
- mysql字符类型大小写敏感的讨论
		
mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...
 - MySQL字符类型datetime与timestamp
		
这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...
 - mysql string types ---- mysql 字符类型详解
		
一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...
 - mysql字符类型
		
字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...
 - MySQL字符类型学习笔记
		
目录 一.字符集和字符编码 1.1.字符集 1.2.字符编码 二.字符集排序规则 2.1.排序规则定义 2.2 .排序规则特征 三.CHAR和VARCHAR 3.1.CHAR类型 3.2.VARCHA ...
 - Mysql字符类型比较
		
一. binary和char比较: binary 字节为单位,char字符为单位,字符占几个字节取决于字符集 binary 比较规则基于字节值,char基于字符,即使是_bin的比较规则 范围都0- ...
 - MYSQL字符类型数值排序
		
今天遇到MySQL数字排序问题,我的排序字段是经过计算后的,而计算后的字段直接拿来排序就会按照字符一个个排序,所以这里找到简单的方法, ORDER BY 排序字段* 或者 ORDER BY 排序字段+ ...
 - mysql字符类型总结及常用字符函数
		
常用字符串函数: concat(s1,s2,s3..) 连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...
 - mysql数值类型总结及常用函数
		
最近在学习下,总结一下mysql数值类型: mysql字符类型分: 1.整数类型: 字节 值范围 INTERGER 1 ...
 
随机推荐
- PHP count_chars() 函数
			
实例 返回一个字符串,包含所有在 "Hello World!" 中使用过的不同字符(模式 3): <?php高佣联盟 www.cgewang.com$str = " ...
 - CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针
			
LINK:Xenia and Colorful Gems 考试的时候没想到一个很好的做法. 赛后也有一个想法. 可以考虑答案的样子 x,y,z 可以发现 一共有 x<=y<=z,z< ...
 - 【NOIP2015】斗地主 题解(DFS+贪心)
			
题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...
 - 家庭记账本APP开发准备(二)
			
今天学习了选项卡,为记账本的分类做了准备.主登录界面进行了优化,但仍未实现各个组件之间的跳转. 选项卡 activity_main.xml <?xml version="1.0&quo ...
 - VMware启动CentOS出错,提示"该虚拟机似乎正在使用中"
			
今天在使用VMware启动CentOS时,出现如下图1错误提示: 当点击“确定”按钮时,出现如下图2错误提示: 无奈,只能点击图1 中的“取消”按钮,进行问题的跟踪.分析.经过核实,发现上述问题是由于 ...
 - JDBC工具类—如何封装JDBC
			
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils.提供获取连接对象的方法,从而达到代码的重复利用. 该工具类提供方法:public static Conne ...
 - Vue 使用$set动态给数据设置属性
			
在实际的开发过程中,给表单元素绑定model的时候,绑定的元素的属性是根据后台数据动态生成的.如果使用常规的赋值方式,是无法更新视图的 需要使用, this.$set(dataName,keyName ...
 - LeetCode 120. Triangle (三角形最小路径和)详解
			
题目详情 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...
 - golang 字符型
			
目录 前言 1. 基本 介绍 2. 声明 3. 使用细节 4. 字符类型的本质 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到 ...
 - Android开发进程0.1  轮播图 Scrollview  Fragment
			
轮播图的实现 轮播图通过banner可以较为便捷的实现 1.添加本地依赖,在dependence中搜索相关依赖 2.添加banner的view组件 3.创建适配器GlideImageLoader ex ...