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 字节 | 极大文本数据 |
字符集
字符串分二进制与非二进制类型,二进制用于贮存图片、声音等文件,非二进制用于贮存文本数据。
非二进制文本受字符集和校对规定影响。
其实字符集说白了就是字符编码。
概念
字符集 (Character set) 是多个字符的汇合,字符集品种较多,每个字符集蕴含的字符个数不同。罕用的字符集有GBK
、BIG5
、UTF8
。
UTF8
字符集蕴含文字内容更广,如韩文、日文、德文兼容度更高,也是举荐应用的字符集(UTF8MB4
)。
表不设置字符集继承数据库,字段不设置字符集继承表的,所以个别咱们在配置文件中为数据库指定字符集即可。
mysql> SHOW CHARACTER SET; -- 查看服务器反对的字符集
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.04 sec)
校对规定
字符集内用于字符比拟和排序的一套规定,以 _ci
完结的为大小写不敏感、_bin
完结的为不辨别大小写。
当应用不辨别大小写的校对规定时 A
与a
是雷同的,否则则不雷同,这会影响到排序与比对。
批改表校对规定,对表的原字段将不影响,只对新增字段影响。
SHOW COLLATION; -- 查看服务器反对的校对规定
根本定义
对于字符类型而言,其指定宽度均为存入宽度,以字符为单位。
mysql> create table `test` (-> ch char(5) not null,
-> vc varchar(5) not null
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
定长变长
区别差别
char
是定长字符串,当存入的字符数量有余指定宽度时,将会应用进行填充。
varchar
是变长字符串,当存入的字符数类有余指定宽度时,不会应用任何字符进行填充。
通常状况下来讲 ,
char
的存取速度要比varchar
要高(约 50%),然而 更加节约磁盘空间。在
InnoDB
存储引擎中,不存在这种差别。
插入值 | CHAR(4)存入值 | CHAR(4)占据空间 | VARCHAR(4)存入值 | VARCHAR(4)占据空间 |
---|---|---|---|---|
'' |
' ' |
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():查看字符数
倡议在同一张数据表中对立应用 varchar
或char
类型,这里更举荐应用 char
类型。
罕用函数
大小写转换
upper()
小写转大写,lower()
大写转小写。
以下将演示大小写转换。
mysql> select upper("justthesame"),lower("JUSTTHESAME");
+----------------------+----------------------+
| upper("justthesame") | lower("JUSTTHESAME") |
+----------------------+----------------------+
| JUSTTHESAME | justthesame |
+----------------------+----------------------+
1 row in set (0.00 sec)
指定量取
left()
与 right()
函数用于取左或右指定数量的字符。
以下将演示取右边 3 个字符。
mysql> select left("qwert",3);
+-----------------+
| left("qwert",3) |
+-----------------+
| qwe |
+-----------------+
1 row in set (0.00 sec)
两头字符
mid()
从两头取字符串,参数二为指定起始地位(从 1 开始),参数三为取的字符数量(可不指定,始终取完)。
以下将演示从第二个字符开始取两个。
mysql> select mid("qwert",2,2);
+------------------+
| mid("qwert",2,2) |
+------------------+
| we |
+------------------+
1 row in set (0.00 sec)
截取字符
substring()
从指定起始地位开始取出向右所有字符串,可指定完结地位。(其实我感觉这个和 mid()
如同没啥区别)。
以下将演示截取第一个字符到第四个字符。
mysql> select substring("qwertyui",1,4);
+---------------------------+
| substring("qwertyui",1,4) |
+---------------------------+
| qwer |
+---------------------------+
1 row in set (0.00 sec)
字符长度
char_length()
可获取字符长度,如果要获取 char
类型的字符长度且包含填充空白符,须要批改 sql
模式。
批改 sql
模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
mysql> select char_length("qwertyu");
+------------------------+
| char_length("qwertyu") |
+------------------------+
| 7 |
+------------------------+
1 row in set (0.00 sec)
字节长度
length()
可获取字节长度。
mysql> select length("qwertyu");
+-------------------+
| length("qwertyu") |
+-------------------+
| 7 |
+-------------------+
1 row in set (0.00 sec)
字符连贯
concat()
可将多段字符进行连贯。
mysql> select concat("123","abc","456","def");
+---------------------------------+
| concat("123","abc","456","def") |
+---------------------------------+
| 123abc456def |
+---------------------------------+
1 row in set (0.00 sec)