关于mysql:MySQL的字符类型

58次阅读

共计 5157 个字符,预计需要花费 13 分钟才能阅读完成。

MySQL 的字符类型

字符类型

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 字节 极大文本数据

字符集

字符串分二进制与非二进制类型,二进制用于贮存图片、声音等文件,非二进制用于贮存文本数据。

非二进制文本受字符集和校对规定影响。

其实字符集说白了就是字符编码。

概念

字符集 (Character set) 是多个字符的汇合,字符集品种较多,每个字符集蕴含的字符个数不同。罕用的字符集有GBKBIG5UTF8

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完结的为不辨别大小写。

当应用不辨别大小写的校对规定时 Aa是雷同的,否则则不雷同,这会影响到排序与比对。

批改表校对规定,对表的原字段将不影响,只对新增字段影响。

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():查看字符数

倡议在同一张数据表中对立应用 varcharchar类型,这里更举荐应用 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)

正文完
 0