字符类型

   MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用charvarchar即可

类型 大小 用途
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

由于varchar类型是变长存储,所以需要有一个头部来标识真实内容占了多少字符,这个头部通常占据1个字节。

即存入abcd的时候算上头部实际上是占用了5个字节。这也是为什么说通常情况下varchar比较节省内存,而不是说全部情况。

差异对比

   如果要想进定长与变长的差异对比试验,需要用到以下两个函数。

   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>

   小总结:建议在同一张数据表中统一使用varcharchar类型,这里更推荐使用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 字符类型的更多相关文章

  1. mysql字符类型大小写敏感的讨论

    mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...

  2. MySQL字符类型datetime与timestamp

    这片博客来详细分区一下这哥俩! 首先来说明这两个字符类型: DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:0 ...

  3. mysql string types ---- mysql 字符类型详解

    一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...

  4. mysql字符类型

    字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...

  5. MySQL字符类型学习笔记

    目录 一.字符集和字符编码 1.1.字符集 1.2.字符编码 二.字符集排序规则 2.1.排序规则定义 2.2 .排序规则特征 三.CHAR和VARCHAR 3.1.CHAR类型 3.2.VARCHA ...

  6. Mysql字符类型比较

    一. binary和char比较: binary 字节为单位,char字符为单位,字符占几个字节取决于字符集 binary  比较规则基于字节值,char基于字符,即使是_bin的比较规则 范围都0- ...

  7. MYSQL字符类型数值排序

    今天遇到MySQL数字排序问题,我的排序字段是经过计算后的,而计算后的字段直接拿来排序就会按照字符一个个排序,所以这里找到简单的方法, ORDER BY 排序字段* 或者 ORDER BY 排序字段+ ...

  8. mysql字符类型总结及常用字符函数

    常用字符串函数: concat(s1,s2,s3..)       连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...

  9. mysql数值类型总结及常用函数

    最近在学习下,总结一下mysql数值类型: mysql字符类型分: 1.整数类型: 字节                    值范围 INTERGER               1         ...

随机推荐

  1. linux之DHCP服务端搭建 ( ip分配 四个阶段原理)

    DHCP服务 ip分配 四个阶段原理 1.DHCP服务目的 协议 作用 租约 原理四个阶段 动态主机配置协议(Dynamic Host Configuration Protocol,动态主机配置协议) ...

  2. SpringCloud服务注册中心

    SpringCloud服务注册中心 Spring Cloud 是一系列框架的有序集合,如服务注册发现.配置中心.消息总线.负载均衡.断路器等,都可以用 Spring Boot 的开发风格做到一键启动和 ...

  3. 如何优雅的设计 Spring Boot API 接口版本号

    原文:https://blog.mariojd.cn/how-to-design-spring-boot-api-version-number-elegantly.html 一般来说,系统上线以后,需 ...

  4. day18.os模块 对系统进行操作

    一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...

  5. ASP.NET中使用Cache类来缓存页面的信息

    实现 如果将数据保存在全局应用程序对象Application中,值将会在程序运行时一直存在,而我们只需要缓存一段时间. ASP.NET提供了一个Cache对象来执行对象数据的缓存. Cache对象是S ...

  6. 【NOIP2015】斗地主 题解(DFS+贪心)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的AAA到KKK加上大小王的共545454张牌来进行的扑克牌游戏.在斗地主中,牌的大小关 系根据牌的数码表示如下: ...

  7. 未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布

    在刚刚结束的CLOUD NATIVE+ OPEN SOURCE Virtual Summit China 2020上,由华为云云原生团队主导的容器批量计算项目Volcano正式发布1.0版本,标志着V ...

  8. 最火热的极速开发框架Spring Boot

    Spring Boot是Spring家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程,也可以说Spring Boot能简化我们之前采用Spring mvc + Spring + ...

  9. 生成对抗网络GAN介绍

    GAN原理 生成对抗网络GAN由生成器和判别器两部分组成: 判别器是常规的神经网络分类器,一半时间判别器接收来自训练数据中的真实图像,另一半时间收到来自生成器中的虚假图像.训练判别器使得对于真实图像, ...

  10. kafka-clients 1.0 高阶API消费消息(未完)

    消费消息的请求(按序) org/apache/kafka/common/requests/RequestHeader org/apache/kafka/common/requests/ApiVersi ...