怎么在MySQL中定义CHAR和VARCHAR

  介绍

怎么在MySQL中定义CHAR和VARCHAR ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

CHAR和VARCHAR的定义

CHAR (N)用来保存固定长度的字符,N的范围是0 ~ 255,请牢记,N表示的是字符,而不是字节.VARCHAR (N)用来保存变长字符,N的范围为0 ~ 65536 N同样表示字符。

在超出65536个字节的情况下,可以考虑使用更大的字符类型文本或BLOB,两者最大存储长度为4 G,其区别是BLOB没有字符集属性,纯属二进制存储。

和Oracle SQL Server等传统关系型数据库不同的是,MySQL数据库的VARCHAR字符类型,最大能够存储65536个字节,所以在MySQL数据库下,绝大部分场景使用类型VARCHAR就足够了。

<强>字符集

在表结构设计中,除了将列定义为CHAR和VARCHAR用以存储字符以外,还需要额外定义字符对应的字符集,因为每种字符在不同字符集编码下,对应着不同的二进制值。常见的字符集有GBK, use UTF8,通常推荐把默认字符集设置为UTF8。

而且随着移动互联网的飞速发展,推荐把MySQL的默认字符集设置为UTF8MB4,否则,某些emoji表情字符无法在UTF8字符集下存储,比如emoji笑脸表情,对应的字符编码为0 xf09f988e:

怎么在MySQL中定义CHAR和VARCHAR

若强行在字符集为UTF8的列上插入emoji表情字符,MySQL会抛出如下错误信息:

mysql>, SHOW  CREATE  TABLE  emoji_test \ G      * * * * * * * * * * * * * * * * * * * * * * * * * * *,1只row  * * * * * * * * * * * * * * * * * * * * * * * * * * *      ,,,,,,表:emoji_test      Create 表:,Create  TABLE “emoji_test”, (      “一个”,才能varchar (100), CHARACTER  SET  use utf8,      PRIMARY 才能;KEY  (' a ')      ),引擎=InnoDB  DEFAULT  CHARSET=utf8            1,row  set 拷贝;(0.01,sec)      mysql>, INSERT  INTO  emoji_test  VALUES  (0 xf09f988e);      ERROR  1366, (HY000):, Incorrect  string 价值:,& # 39;\ xF0 \ x9F \ x98 \ x8e # 39;, for  column  & # 39;一个# 39;,at  row  1

包括MySQL 8.0版本在内,字符集默认设置成UTF8MB4, 8.0版本之前默认的字符集为Latin1。中的一个因为不同版本默认字符集的不同,你要显式地在配置文件中进行相关参数的配置:

(mysqld)      character-set-server =utf8mb4      …

另外,不同的字符集,CHAR (N), VARCHAR (N)对应最长的字节也不相同。比如GBK字符集,1个字符最大存储2个字节,UTF8MB4字符集1个字符最大存储4个字节,所以从底层存储内核看,在多字节字符集下,CHAR和VARCHAR底层的实现完全相同,都是变长存储!

怎么在MySQL中定义CHAR和VARCHAR

从上面的例子可以看的到,CHAR(1)既可以存储1个& # 39;一个# 39;字节,也可以存储4个字节的emoji笑脸表情,因此CHAR本质也是变长的。

鉴于目前默认字符集推荐设置为UTF8MB4,所以在表结构设计时,可以把字符全部用VARCHAR替换,底层存储的本质实现一模一样。

<>强排序规则

排序规则(排序)是比较和排序字符串的一种规则,每个字符集都会有默认的排序规则,你可以用命令显示字符集来查看:

mysql>, SHOW  CHARSET  LIKE  & # 39; utf8%& # 39;;      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +      | |,Charset  Description ,, |, Default  collation , |, Maxlen  |      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +      |,utf8 ,,, |, UTF-8  Unicode  |, utf8_general_ci ,,, |,,,,,, 3 |      | |,utf8mb4  UTF-8  Unicode  |, utf8mb4_0900_ai_ci  |,,,,,, 4 |      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +      2,rows  set 拷贝;(0.01,sec)            mysql>, SHOW  COLLATION  LIKE  & # 39; utf8mb4%& # 39;;      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +      |,Collation ,,,,,,,,,,,,,,,,, |, Charset  |, Id , |, Default  |, Compiled  |, Sortlen  | Pad_attribute  |      + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +      |,utf8mb4_0900_ai_ci ,,,,,,,, |, utf8mb4  |, 255, |, Yes ,,,, |, Yes ,,,,, |,,,,,,, 0, |, NO  PAD ,,,,,, |      |,utf8mb4_0900_as_ci ,,,,,,,, |, utf8mb4  |, 305, |,,,,,,,,, |, Yes ,,,,, |,,,,,,, 0, |, NO  PAD ,,,,,, |      |,utf8mb4_0900_as_cs ,,,,,,,, |, utf8mb4  |, 278, |,,,,,,,,, |, Yes ,,,,, |,,,,,,, 0, |, NO  PAD ,,,,,, |      |,utf8mb4_0900_bin ,,,,,,,,,, |, utf8mb4  |, 309, |,,,,,,,,, |, Yes ,,,,, |,,,,,,, 1, |, NO  PAD ,,,,,, |      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在MySQL中定义CHAR和VARCHAR