当前位置:   article > 正文

mysql中如何选择char与varchar_mysql char character

mysql char character

mysql中如何选择char与varchar

先补充一下基础知识.

Unicode 数据

Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个唯一编码方案。
所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。
这保证了同一个位模式在所有的计算机上总是转换成同一个字符。
数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。
对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示 256(2^8 一个Byte对应8bit)个不同的字符。
这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。
而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。

Unicode规格通过采用两个字节编码每个字符使这个问题迎刃而解.
2字节编码的模式可以表示(65,536 = (28)2)。因为所有的Unicode系统均一致地采用同样的位模式来代表所有的字符,
所以当从一个系统转到另一个系统时,将不会存在未正确转换字符的问题。

UTF8-mb4

UTF-8 是一种 Unicode 字符集的编码方式,它可以表示 Unicode 中的所有字符。它使用 1 至 4 个字节来表示一个字符,不同范围内的字符所需字节数也不同。
UTF-8 mb4 是 MySQL 中用于存储 Unicode 字符串的一种字符集,mb4 是“多字节 4 字节”的缩写,意味着它能够支持 4 字节长的 Unicode 字符。

2个字节编码标识的方式有点不够用了

Unicode 是一种字符集标准,定义了世界上几乎所有的字符和符号的编码。它包括了各种语言、标点符号、数学符号、音乐符号、表情等。
在 MySQL 中,常用的字符集包括 Latin1 和 UTF-8 mb4。Latin1 是一种较旧的字符集,只能表示最基本的 ASCII 字符集中的字符以及一些特殊字符。
而 UTF-8 mb4 则是现代应用中常用的字符集,它可以表示 Unicode 中任何字符,包括表情等复杂符号。

Unicode是接口抽象. UTF-8 是接口契约的一种实现.
按照契约进行绑定的两个实体.可以与任何实现相同接口的实体进行交互.
接口-抽象 模式降低了替换接入方的的成本和风险. 降低了接入过程的心智负担.

总体来说,UTF-8 是 Unicode 字符集的其中一种编码方式,UTF-8 mb4 是 MySQL 中用于存储 Unicode 字符串的一种字符集。
它们都与 Unicode 相关联,但是具体的含义和用途有所不同。

mysql中的 utf8 与 utf8mb4

在 UTF-8 编码中,中文字符通常占用 3 个字节的空间。而在 MySQL 中的 UTF-8 编码实现(也称为 “utf8” 编码),
只使用了 3 字节来存储部分中文字符,因此无法完全支持包括 Emoji 表情等在内的所有 Unicode 字符。
为了解决这个问题,MySQL 版本 5.5.3 及以上引入了 UTF-8 mb4 编码,通过使用 4 个字节存储每个字符来支持所有的 Unicode 字符,
包括 Emoji 表情等复杂符号。在 UTF-8 mb4 编码中,中文字符仍然占用 3 个字节的空间。
需要注意的是,在某些情况下,中文字符可能会被表示成 Unicode 编码形式,例如 “\u4e2d\u6587”,
其中每个 Unicode 编码点都表示一个中文字符,占用 6 个字节的空间。但在实际存储和传输中,通常使用 UTF-8 或 UTF-8 mb4 编码,中文字符占用 3 个字节的空间。

其实mysql中的utf8并不是真正的支持每个字符最大四个字节,而是三个字节,中文是占3个字节,
其他数字、英文、符号占一个字节。自己日常使用影响不大,但是emoji符号占4个字节,一些较复杂的文字、繁体字也是4个字节。
考虑到可扩占性. 还是用utf8mb4最好.

选择的问题

通常在建表的时候对于String 类型的数据定义我们或许会很纠结 : 什么时候用char 什么时候用 varchar 呢?

  • varchar 更节省空间. 时间效率稍差.
  • char 占用冗余空间. 时间效率更高.

char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找, (模式固定,便于优化算法的应用从而提升效率)
但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

MySQL中存储的字符串默认是使用一种叫做 Latin1 的字符集编码的非 Unicode 字符串。
这是因为 MySQL 最初开发的时候,Unicode 还没有成为普遍采用的编码标准。

Latin1 编码可以表示 256 种不同的字符,包括英文字母、数字、标点符号以及一些特殊字符。
相比之下,Unicode 则能够表示更多的字符,包括世界上几乎所有的语言和符号。

虽然现在 Unicode 已经成为了主流的编码标准,但由于兼容性和历史原因,MySQL 仍然默认使用 Latin1 编码来存储字符串。
当需要存储 Unicode 字符串时,可以使用 UTF-8 编码或者其他支持 Unicode 的字符集来代替 Latin1。

现在几乎都会用 mysql-utf8mb4来存储字符串. 那么如何指定长度.

mysql建表语句中的 char(50) 中的50指的是最多容纳50个字符还是最多容纳50个字节 ?

在 MySQL 中,char(50) 中的数字 50 表示该 char 类型字段占用的固定长度,以字节为单位。
每个 char 类型字符都占用指定长度的空间,如果存储的字符数少于该长度,则剩余的空间将会填充空格。

需要注意的是,对于使用 UTF-8 编码的字符串而言,一个字符并不一定占用一个字节的空间,因为 UTF-8 是一种变长编码方式。
在这种情况下,char(50) 应该被理解为占用 50 个字节的空间,而不是能够容纳 50 个字符。

如果要确保能够容纳一定数量的字符,可以考虑使用 varchar 类型,并将其长度设置为最大可能出现的字符数乘以每个字符可能占用的最大字节数。

如果我使用mysql char类型来存储utf8编码的字符串. 我应该如何合理设置其长度. 请描述计算公式及计算原理.

在 MySQL 中,使用 CHAR 类型来存储 UTF-8 编码的字符串时,需要注意其长度的设置。
由于 UTF-8 是一种变长编码方式,不同字符所占用的字节数也是不同的,因此需要根据实际情况来计算合理的长度

UTF-8 中一个字符所占用的最大字节数是 4,而 MySQL 中的 CHAR 类型默认使用 Latin1 字符集,每个字符占用一个字节。
因此,如果要存储 UTF-8 编码的字符串,需要将 CHAR 的长度设置为字符数乘以每个字符所占用的最大字节数,即:

length = max_byte_length * character_count
  • 1

其中,max_byte_length 表示要存储的字符串中单个字符所占用的最大字节数,这里取 4。character_count 表示要存储的字符串中包含的字符数。
例如,要存储一个包含 10 个 UTF-8 编码字符的字符串,可以使用以下 SQL 语句来创建一个长度为 40 的 CHAR 类型字段:

sql
CREATE TABLE mytable (
    id INT,
    utf8_string CHAR(40)
);
  • 1
  • 2
  • 3
  • 4
  • 5

需要注意的是,这种方法只适用于存储固定长度的字符串。如果要存储可变长度的字符串,应该使用 VARCHAR 类型,并将其长度设置为能够容纳最长的字符串即可。

比如说我想使用 char来存储固定长度的 vin. 车架号通常为17位的数字字母混合. 在utf8mb4编码标准下, 数字字母占用一个字节空间.
所以我们最小声明为char(17)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/228083
推荐阅读
相关标签
  

闽ICP备14008679号