当前位置: 首页 > 科技观察

随笔:如何给女朋友解释为什么在MySQL中不能使用UTF-8编码

时间:2023-03-20 00:27:08 科技观察

MySQL是关系型数据库,大家都很熟悉。使用MySQL创建数据库时,需要指定编码方式。很多时候,根据自己对编码方式的理解,你会认为UTF-8是一种通用的编码方式,所以大多数时候你会默认选择这种编码方式。但是,这通常会在您的数据库中埋下一个大洞!!!MySQL支持Unicode字符集,Unicode是现在计算机科学领域的行业标准,它支持世界上大部分的书写系统。为了组织和编码,计算机可以以更简单的方式呈现和处理文本。为了满足不同的数据存储和传输要求,人们提出了UnicodeTransformationFormat(UTF)系列编码。这包括UTF-8、UTF-16、UTF-32等。通过查阅MySQL官方文档(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html),我们可以知道在MySQL中,主要支持以下字符集:utf8,ucs2,utf8mb3,utf8mb4,utf16,utf16le和utf32不同的字符集包含的字符和需要存储的空间不同。字符集支持的字符每个字符需要的存储空间utf8mb3、utf8BMP1-3字节ucs2BMP2字节utf8mb4BMP和增补字符1-4字节utf16BMP和增补字符2或4字节utf16leBMP和增补字符2或4bytesutf32BMPandsupplementarycharacters4bytes在MySQL官方文档中,在介绍了支持的编码方式后,有一个醒目的提示:翻译过来就是:utf8mb3charactersethasbeendeprecated,itwillbeusedinthefuturewillberemovedinMySQL版本,请改用utf8mb4。在目前的8.0版本中,utf8指的是utf8mb3。虽然以后可能会改成utf8mb4,但是为了避免歧义,可以考虑明确指定utf8mb4而不是utf8作为字符集引用。也就是说,当我们在MySQL8.0中指定字符编码方式为UTF-8时,实际使用的是utf8mb3的编码方式。那么,让我们先谈谈utf8mb3。utf8mb3utf8mb3字符集是MySQL早期支持的字符集。它有以下特点:1.只支持BMP字符(不支持增补字符)2.每个多字节字符最多需要三个字节注意只支持BMP字符,那么什么是BMP字符?BMP是BasicMultilingualPlane的缩写,即码位在0到65535(或U+0000到U+FFFF)之间的字符。BMP不包含增补字符,即代码点在U+10000和U+10FFFF之间的字符。什么是增补字符,比如一些生僻的汉字,或者Emoji表情等等都是增补字符。也就是说,如果在建表时指定编码方式为utf8mb3(utf-8),则无法表示一些生僻字或emoji表情。utf8mb4早期,Unicode只使用0~0xFFFF范围内的数字编码,也就是BMP字符集。所以在MySQL设计之初,只涉及到包含BMP字符集的utfmb3(utf-8),但是随着写入的字符越来越多,3个字节已经不能完全表示了,所以Unicode支持的字符是更多的。所以早期的utfmb3在某些场景下无法满足需求,所以MySQL在5.5.3之后加入了utf8mb4编码。utfmb4字符集具有以下特点:1.支持BMP和增补字符。2.每个多字节字符最多需要4个字节。utf8mb4字符集不同于utf8mb3字符集。utf8mb3字符集只支持BMP字符,每个字符最多使用三个字节:对于BMP字符,utf8mb4和utf8mb3具有相同的存储特性,即编码值相同,编码相同,长度相同。对于增补字符,utf8mb4需要4个字节来存储,而utf8mb3根本存储不了那个字符。所以我们说utf8mb4是utf8mb3的超集。所以很多时候,为了考虑兼容性,建表时建议使用utf8mb4,而不是utf8!前面介绍了utf8mb3和utf8mb4的区别和优缺点。utf8mb3和utf8mb4的区别如下:utf8mb3只支持BMP(BasicMultilingualPlane)字符。utf8mb4还支持BMP之外的增补字符。utf8mb3每个字符最多使用3个字节。Utf8mb4每个字符最多使用4个字节。与utf8mb3相比,utf8mb4可以表示更多的增补字符,但同时可能会占用更多的空间。utf8mb3转utf8mb4首先,字符集utf8mb3转utf8mb4问题不大:对于BMP字符,utf8mb4和utf8mb3具有相同的存储特性:相同的编码值,相同的编码,相同的长度.对于增补字符,utf8mb4需要4个字节来存储,而utf8mb3根本存储不了那个字符。将utf8mb3列转换为utf8mb4时,不必担心转换增补字符,因为没有增补字符。假设有一张已知道表使用了utf8mb3:CREATETABLEt1(col1CHAR(10)CHARACTERSETutf8COLLATEutf8_unicode_ciNOTNULL,col2CHARNOLLATENULL8CHARACTERSETutf)CHARACTERSETutf8;下面的语句将t1转换为utf8mb4:ALTERTABLEt1DEFAULTCHARACTERSETutf8mb4,MODIFYcol1CHAR(10)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ciNOTNULL,MODIFYcol2CHAR(10)CHARACTERSETutf8mb4COLLATEutf8mb4_binNOTNULL;关于Author:ManhuaProgramming,isa公众号explainingboringprogrammingknowledgeintheformofcomics+audio.致力于让编程变得更有趣。本文转载自微信公众号“漫花编程”,可通过以下二维码关注。转载本文请联系漫花编程公众号。