mysql字符类_MySQL的字符类型

MySQL的字符类型

字符类型

MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用char和varchar即可。类型大小用途CHAR0 - 255字节定长字符串

VARCHAR0 - 65535 字节变长字符串

TINYBLOB0 - 255字节不超过 255 个字符的二进制字符串

TINYTEXT0 - 255字节短文本字符串

BLOB0 - 65 535字节二进制形式的长文本数据

TEXT0 - 65 535字节长文本数据

MEDIUMBLOB0 - 16 777 215字节二进制形式的中等长度文本数据

MEDIUMTEXT0 - 16 777 215字节中等长度文本数据

LONGBLOB0 - 4 294 967 295字节二进制形式的极大文本数据

LONGTEXT0 - 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值