MySQL基础知识01数据类型(一)字符串相关类型

1. CHAR

语法:

CHAR (length)

其中length的取值范围为1到255。

超过255则报错:

mysql> create table s3 ( value char(1023) primary key);

ERROR 1074 (42000): Column length too big for column ‘value‘ (max = 255); use BLOB or TEXT instead

例如:CHAR(20)表示最多包含20个字符的字符串。存储时,不足20个字符时后面加空格。

在默认情况下,提取时,自动删除掉后面的空格;在PAD_CHAR_TO_FULL_LENGTH时,则不会删除后面的空格,即提取后的结果包含20个字符。

假定存在如下数据:

mysql> show create table s1;

+-------+-----------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                    |

+-------+-----------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

`value` char(10) NOT NULL,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+-----------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> insert into s1 values (‘ABC‘) ,  (‘1234567890‘) , (‘ 12 3 45 ‘);

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

在默认情况下:

mysql> set sql_mode=‘‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+------------+

| length(value) | char_length(value) | value      |

+---------------+--------------------+------------+

|             8 |                  8 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|             3 |                  3 | ABC        |

+---------------+--------------------+------------+

3 rows in set (0.00 sec)

在sql_mode为PAD_CHAR_TO_FULL_LENGTH时,将不会删除CHAR类型的字符串后面附加的空格。

mysql> set sql_mode=‘pad_char_to_full_length‘;

Query OK, 0 rows affected (0.00 sec)

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+------------+

| length(value) | char_length(value) | value      |

+---------------+--------------------+------------+

|            10 |                 10 |  12 3 45   |

|            10 |                 10 | 1234567890 |

|            10 |                 10 | ABC        |

+---------------+--------------------+------------+

3 rows in set (0.00 sec)

mysql> select @sql_mode;

+-----------+

| @sql_mode |

+-----------+

| NULL      |

+-----------+

1 row in set (0.00 sec)

mysql> select @@sql_mode;

+-------------------------+

| @@sql_mode              |

+-------------------------+

| PAD_CHAR_TO_FULL_LENGTH |

+-------------------------+

1 row in set (0.00 sec)

2. VARCHAR

语法:

VARCHAR(max-length)

其中,max-length是该类型字符串最多可以存储的字符的个数。整个字段占用的空间大小是长度占有的字节数加上实际字符所占有的字节数。当字符串长度在0到255时,长度占1个字节,当字符串长度超过255个字符时,长度占2个字节。VARCHAR类型最多65535个字符。

mysql> create table s13 ( value varchar(10) primary key);

Query OK, 0 rows affected (0.02 sec)

mysql> insert into s13 values (‘ABCD‘) , (‘ A B ‘);

Query OK, 2 rows affected (0.05 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> select @@sql_mode;

+-------------------------+

| @@sql_mode              |

+-------------------------+

| PAD_CHAR_TO_FULL_LENGTH |

+-------------------------+

1 row in set (0.00 sec)

mysql> select length(value), char_length(value), value from s13;

+---------------+--------------------+-------+

| length(value) | char_length(value) | value |

+---------------+--------------------+-------+

|             5 |                  5 |  A B  |

|             4 |                  4 | ABCD  |

+---------------+--------------------+-------+

2 rows in set (0.00 sec)

从上述结果可以看到,PAD_CHAR_TO_FULL_LENGTH模式对于VARCHAR类型没有作用,这个模式只对CHAR类型有作用。

3. 字段长度限制

(1)主键为VARCHAR类型时的长度限制为3072个字符。

mysql> create table s5 ( value varchar(65535) primary key);

ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

mysql> create table s5 ( value varchar(3072) primary key);

Query OK, 0 rows affected (0.02 sec)

(2)VARCHAR类型的字段的长度大于或等于65536时,自动转化为TEXT相关类型。

原因就是因为VARCHAR类型在存储时要保存字符串长度,而且最多占用2个字节。

mysql> create table s6 ( value varchar(3072) primary key , v varchar(65536));

Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show warnings;

+-------+------+--------------------------------------------+

| Level | Code | Message                                    |

+-------+------+--------------------------------------------+

| Note  | 1246 | Converting column ‘v‘ from VARCHAR to TEXT |

+-------+------+--------------------------------------------+

1 row in set (0.00 sec)

mysql> show create table s6;

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                           |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

| s6    | CREATE TABLE `s6` (

`value` varchar(3072) NOT NULL,

`v` mediumtext,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

(3)一个行中的VARCHAR和CHAR类型的字符串的最大长度总和不能超过65535个字符。

mysql> create table s12 ( value  int  primary key , v varchar(65535));

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> create table s12 ( value  int  primary key , v varchar(65500));

Query OK, 0 rows affected (0.03 sec)

(4)当CHAR类型的字段插入超过定义长度的数据时,将自动截取为定义长度。

mysql> show create table s1;

+-------+---------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                  |

+-------+---------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

`value` char(10) NOT NULL,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> insert into s1 values (‘12345678901234‘);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1265 | Data truncated for column ‘value‘ at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

mysql> select * from s1;

+--------------+

| value        |

+--------------+

|              |

| 1234567890   |

| 中           |

+--------------+

3 rows in set (0.00 sec)

(5)当VARCHAR类型的字段在插入数据时长度超过定义的长度,将自动截取到定义的长度。

mysql> insert into s13 values (‘12345678901234‘);

Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;

+---------+------+--------------------------------------------+

| Level   | Code | Message                                    |

+---------+------+--------------------------------------------+

| Warning | 1265 | Data truncated for column ‘value‘ at row 1 |

+---------+------+--------------------------------------------+

1 row in set (0.00 sec)

mysql> select * from s13;

+------------+

| value      |

+------------+

|  A B       |

| 1234567890 |

| ABCD       |

+------------+

3 rows in set (0.00 sec)

4. 字符集

默认情况下,数据表的字符集为latin1。可以在create table或者alter table时修改数据表的字符集为utf8。

mysql> show variables like ‘%character%‘;

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | utf8                       |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

8 rows in set (0.01 sec)

mysql> show create table s1;

+-------+---------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                  |

+-------+---------------------------------------------------------------------------------------------------------------+

| s1    | CREATE TABLE `s1` (

`value` char(10) NOT NULL,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+---------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select length(value) , char_length(value) , value from s1;

+---------------+--------------------+-------+

| length(value) | char_length(value) | value |

+---------------+--------------------+-------+

|             3 |                  1 | 中    |

+---------------+--------------------+-------+

1 row in set (0.00 sec)

LENGTH表示字节数,CHAR_LENGTH表示字符数。在使用UTF8字符集时,一个汉字的字节数为3,即LENGTH为3,;而一个汉字的字符数仍然为1,即CHAR_LENGTH仍然为1。

5. BINARY

BINARY用法与CHAR类似,只是可以存储所有字符值,包括空字符(ASCII值为0),而且末尾补足长度的字符为空字符,而不是空格。BINARY类型最大长度255个字节,并非255个字符。

mysql> create table b1 (value binary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

mysql> insert into b1 values(‘1234567890‘) , (‘123‘);

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> select value,hex(value) from b1;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

| 123        | 31323300000000000000 |

| 1234567890 | 31323334353637383930 |

+------------+----------------------+

2 rows in set (0.00 sec)

使用unhex()函数可以将十六进制字符串转化为不可见字符组成的字符串,插入不可见字符的例子如下:

mysql> insert into b1 values ( unhex(‘01020300010203‘));

Query OK, 1 row affected (0.01 sec)

mysql> select value,hex(value) from b1;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

|      | 01020300010203000000 |

+------------+----------------------+

1 row in set (0.00 sec)

当BINARY类型超过255个字节时,将报错。

mysql> create table b10 ( value int  primary key, v binary(256));

ERROR 1074 (42000): Column length too big for column ‘v‘ (max = 255); use BLOB or TEXT instead

6. VARBINARY

VARBINARY与BINARY类似,二者之间差异与 VARCHAR和CHAR之间的差异类似。而VARBINARY和VARCHAR也很类似,二者之间的差异与BINARY和CHAR之间的差异类似。

当最大长度为0到255字节时,长度前缀为1个字节,字段总长度为1+最大长度个字节。

当最大长度为256到65535字节时,长度前缀为2个字节。

mysql> create table b2 ( value varbinary(10) primary key);

Query OK, 0 rows affected (0.03 sec)

mysql> insert into b2 values ( ‘1234567890‘), ("123"), (unhex(‘01020300010203‘));

Query OK, 3 rows affected (0.01 sec)

Records: 3  Duplicates: 0  Warnings: 0

mysql> select value, hex(value) from b2;

+------------+----------------------+

| value      | hex(value)           |

+------------+----------------------+

|      | 01020300010203       |

| 123        | 313233               |

| 1234567890 | 31323334353637383930 |

+------------+----------------------+

3 rows in set (0.00 sec)

当VARBINARY类型超过65535字节时,将自动转换为BLOB相关类型。

mysql> create table b9 ( value int  primary key, v varbinary(65536));

Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> show warnings;

+-------+------+----------------------------------------------+

| Level | Code | Message                                      |

+-------+------+----------------------------------------------+

| Note  | 1246 | Converting column ‘v‘ from VARBINARY to BLOB |

+-------+------+----------------------------------------------+

1 row in set (0.00 sec)

mysql> show create table b9;

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                     |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| b9    | CREATE TABLE `b9` (

`value` int(11) NOT NULL,

`v` mediumblob,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

7. TEXT

有四种TEXT相关类型,它们之间的差别在于允许的最大长度不相同。

TINYTEXT:1到255个字节。字段长度前缀1个字节。

TEXT:256到65535个字节。字段长度前缀2个字节。

MEDIUMTEXT:65536到2的24次方-1个字节。字段长度前缀3个字节。

LONGTEXT:2的24次方到2的32次方-1个字节。字段长度前缀4个字节。

在创建数据表时,在CREATE TABLE语句中只使用TEXT类型即可,MySQL将根据TEXT(N)中的N自动决定实际使用TINYTEXT或TEXT或MEDIUMTEXT或LONGTEXT。在使用其它三个类型时则没有这种根据长度自动决定实际类型的功能,而且不能指定最大长度。

mysql> create table b3 ( value int primary key , v text(30) );

Query OK, 0 rows affected (0.04 sec)

mysql> show create table b3;

+-------+--------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                   |

+-------+--------------------------------------------------------------------------------------------------------------------------------+

| b3    | CREATE TABLE `b3` (

`value` int(11) NOT NULL,

`v` tinytext,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+--------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> create table b4 ( value int primary key , v text(65536) );

Query OK, 0 rows affected (0.02 sec)

mysql> show create table b4;

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                     |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

| b4    | CREATE TABLE `b4` (

`value` int(11) NOT NULL,

`v` mediumtext,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> create table b5 ( value int primary key , v text(300) );

Query OK, 0 rows affected (0.02 sec)

mysql> show create table b5;

+-------+----------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                               |

+-------+----------------------------------------------------------------------------------------------------------------------------+

| b5    | CREATE TABLE `b5` (

`value` int(11) NOT NULL,

`v` text,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.01 sec)

TEXT类型和VARCHAR类型类似,并不会进行长度补足的操作。

8. BLOB

BLOB相关类型也有类似的四种类型:

有四种BLOB相关类型,它们之间的差别在于允许的最大长度不相同。

TINYBLOB:1到255个字节。字段长度前缀1个字节。

BLOB:256到65535个字节。字段长度前缀2个字节。

MEDIUMBLOB:65536到2的24次方-1个字节。字段长度前缀3个字节。

LONGBLOB:2的24次方到2的32次方-1个字节。字段长度前缀4个字节。

mysql> create table b11 ( value int primary key, v blob(100));

Query OK, 0 rows affected (0.03 sec)

在定义数据表时,如果使用BLOB(N)的形式定义字段,则实际字段类型被自动调整为最适合最大长度N的BLOB相关类型。

mysql> show create table b11;

+-------+---------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                    |

+-------+---------------------------------------------------------------------------------------------------------------------------------+

| b11   | CREATE TABLE `b11` (

`value` int(11) NOT NULL,

`v` tinyblob,

PRIMARY KEY (`value`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+---------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

BLOB相关类型在实际存储和读取时,不会发生长度补足操作和截取操作,而是存储和读取原始二进制数据内容。

mysql> insert into b11 values (1,unhex(‘01020300010203‘)),(2,‘1234567890‘);

Query OK, 2 rows affected (0.01 sec)

Records: 2  Duplicates: 0  Warnings: 0

mysql> select value, v,hex(v) from b11;

+-------+------------+----------------------+

| value | v          | hex(v)               |

+-------+------------+----------------------+

|     1 |      | 01020300010203       |

|     2 | 1234567890 | 31323334353637383930 |

+-------+------------+----------------------+

2 rows in set (0.00 sec)

时间: 2024-10-17 22:31:22

MySQL基础知识01数据类型(一)字符串相关类型的相关文章

MySQL基础知识02数据类型(二)数值相关类型

1.INT MySQL支持5中整数类型,每个整数类型又可以分为有符号整数和无符号整数. 类型 字节数 TINYINT 1 SMALLINT 2 MEDIUMINT 3 INT 4 BIGINT 8 1.1.2. DECIMAL(NUMERIC) MySQL使用DECIMAL表示定点数,NUMERIC是DECIMAL的一个别名. DECIMAL(5,2)表示这个定点数类型的整数和小数部分总共5位,其中3位是整数,2位是小数. DECIMAL的总位数最多65位,超出65则报错. mysql> cre

MySQL基础知识03数据类型(三)日期时间相关类型

1. DATE DATE类型只包含日期,格式:'YYYY-MM-DD'.范围从'0000-01-01'到'9999-12-31'.其中年月日只能输入有效的年月日. mysql> create table d1 ( id  date primary key); Query OK, 0 rows affected (0.02 sec) mysql> show create table d1; +-------+--------------------------------------------

Mysql基础知识:数据类型

Mysql基础数据类型 1. 整数类型 2. 浮点数类型和定点数类型 DECIMAL型的取值范围与DOUBLE相同,但是DECIMAL的有效范围由M.D决定.而且DECIMAL的字节数为M+2,即定点数的存储空间是根据其精度决定的. M:精度,是数据的总长度,小数点不占位置: D:标度,小数点后的长度 eg:FLOAT(6,2):数据长度为6,小数点后保留2位的FLOAT数据类型.按照该定义,1234.56符合要求. 3. 日期和时间类型 YEAR类型:(使用1个字节表示) 可以用4位字符串或数

MySQL基础知识04数据类型(四)日期时间的格式转换

1. UNIX_TIMESTAMP MySQL提供了UNIX_TIMESTAMP()函数,用于计算自从1970-01-01 08:00:00以来所经过的秒数.此处开始时间是1970-01-01 08:00:00,而不是1970-01-01 00:00:00.对于早于1970-01-01 08:00:00的时间,返回值都为0.这个相对时间单位为秒,支持小数. mysql> select unix_timestamp(); +------------------+ | unix_timestamp(

MySQL基础知识

MySQL基础知识: 一. 知识点:        1. SQL分类:按照其功能不同,分为3中类别           DDL(Data Defintion Language):数据定义语句,用于定义不同的数据段.数据库.表.列.索引等.常用的语句关键字包括create.drop.alter等;             DML(Data Manipulation Language):数据操纵语句,用于添加.删除.更新和查询数据库记录,并检查数据的完整性.常用的语句关键字主要包括insert.de

mysql基础之基本数据类型

原文:mysql基础之基本数据类型 列类型学习 mysql三大列类型 整型 Tinyint/ smallint/ mediumint/int/ bigint(M) unsigned zerofill 字符串型 Char(M) Varchar(M) Text 文本类型 日期时间类型 Date 日期 Time 时间 Datetime 时间时间类型 Year 年类型 整形: 整型系列所占字节与存储范围的关系. 定性: 占字节越多,存储范围越大. 下图: 是具体的数字分析 Tinyint 1个字节 8个

mysql基础知识之增删查改使用介绍

 mysql基础知识之增删查改使用介绍 本文主要介绍mysql常用的SELECT.INSERT.UPDATE.DELETE语句的使用,数据库的安装这里不做介绍,并且事先已经准备好相关数据. 本文中使用的student表中的数据如下: mysql> SELECT * FROM student; 一.SELECT语句的使用 1.单表查询 语法格式: SELECT culom1,culom2,culom3 FROM TABLE_NAME; 可以改变字段显示顺序 2.WHERE子句查询 语法格式: SE

javascript 基础知识1 数据类型

首先javascript是一种具有面向对象能力的,解释型程序设计语言. js对大小写敏感,一定要采取一致的字符大小写形式,在js中的结束分号(:)是可选的,为了避免JS语句错误,我们还是要注意添加,养成良好的编写习惯. 下面看看数据类型和值. JS有7种数据类型:字符串.数字.布尔.数组.对象.Null.Undefined 字符串类型:由Unicode字符,数字,标点符号组成的序列,可以为多个字符,也可以为0个字符. 1 <script> 2 // var用于声明一个变量 3 var stri

Linux基础知识第八讲,系统相关操作命令

目录 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 2.磁盘信息查看. 3.系统进程 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 时间和日期 date cal 磁盘和目录空间 df du 进程信息 ps top kill 1.时间和日期命令学习. 序号 命令 作用 01 date 查看系统时间 02 cal calendar 查看日历,-y 选项可以查看一年的日历 如下: 2.磁盘信息查看. 序号 命令 作用 01 df -h disk free 显示磁盘剩余空间 02