指南如何在MySQL中存储看起来乱码的字符?我在《如何将UTF8字符集表直接转换为UTF8MB4》一文中介绍了几种将表字符集从UTF8直接转换为UTF8MB4的方法。1、只修改字符集(使用默认验证集)yejr@imysql.com>altertablet1converttocharactersetutf8mb42,同时修改表字符集和验证集yejr@imysql.com>altertablet1converttocharactersetutf8mb4collat??eutf8mb4_bin;3.只修改某列的字符集yejr@imysql.com>altertablet1modifyc1varchar(20)charactersetutf8mb4notnulldefault''4.同时修改某列的字符集和checksumyejr@imysql.com>altertablet1modifyc1varchar(20)charactersetutf8mb4collat??eutf8mb4_unicode_cinotnulldefault''嗯,有一个字符集为UTF8MB4的表,我要存储用于不同字符集的文本、避免出现乱码应该注意哪些事项?如果通过WEB界面存储数据,建议在浏览器端和服务器端都使用UTF8字符集,MySQLServer端使用UTF8/UTF8MB4(对于大多数文本来说,UTF8字符集其实已经足够了用于存储)。其中,MySQL端的字符集设置比较混乱,涉及到几个字符集:character_set_server,服务器端的默认字符集;character_set_database,数据库的默认字符集,如果不设置,则与character_set_server的设置相同;database数据表中的数据表/存储过程/存储函数也可以自己设置字符集。如果不指定,则与character_set_database的设置相同;数据表中的字符类型栏也可以单独设置字符集。如果不设置,则与表中指定的字符集相同;character_set_client,客户端显示读取结果的字符集;character_set_connection,客户端从服务端读取数据时传输的字符集;character_set_results,服务端向客户端发送数据时的字符可以看出,与字符集相关的因素太多了,所以我们强烈建议所有链接都使用相同的字符集,以免出现意外情况。当MySQL使用UTF8MB4字符集时,存储文本实际消耗的字节数由文本内容的字节数决定,并不总是4字节。下面列举几种情况:当输入字符集为任意字符,存储ASCII字符时,每个字符需要1个字节;输入字符集为GB2312,存储字符为汉字时,每个字符占用2个字节;输入字符集为UTF8/UTF8MB4,存储字符为低码汉字时,每个字符需要3个字节;input当字符集为UTF8/UTF8MB4,且存储的字符为高码汉字时,每个字符需要4个字节;输入字符集为二进制,存储字符为高码汉字时,每个字符需要4个字节;后端(浏览器=>WEBServer=>MySQL连接层=>Server层=>DB层>TABLE层),尽量使用相同的字符集;尽量使用大字符集,即优先级:UTF8Mb4>UTF8>GBK>LATIN1;使用逻辑备份数据时,记得时常进行恢复测试。我曾经在这方面跌跌撞撞,吸取了惨痛的教训。附件1、编码简介ASCII码,占7bit,由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行、制表等4)和控制字符(退格、铃等);latin1,占1个字节,在ASCII的基础上增加了128到255范围内的字符;GB2312等CJK字符集,变长字符集,最多占用2个字节,用于存储常用的CJK字符;UTF8,变长字符集,最多占用3个字节,可以包含ASCII、CJK等大部分常用语言;中间其实有一个UNICODE字符集,也是2个字节,也可以包含ASCII字符,但是即使是ASCII字符也需要消耗2bytes,存在一定的浪费,而且在使用UTF8存储ASCII时字符,实际只需要1byte,更节省存储空间;UTF8MB4,变长字符集,最多占用4bytes,可以包含以上其他字符集。;同样,在UTF8MB4中存储ASCII字符时,实际上只占用1byte,存储一般汉字占用3byte,存储单个汉字需要4byte,存储emoji也至少需要4byte;附2、字符集兼容在线测试方便大家,我写了一个简单的PHP接口来测试。可以提交一些生僻的汉字或者emoji表情,看看能不能正常显示。在开发这个接口的时候,我发现钉钉里面的单个emoji是由两个4字节的代码组成的,也就是说一个emoji表情其实需要8个字节。该接口最大输出格式为:string:字节数,如“atootha:5”,表示“atootha”这个字符串一共消耗5个字节,因为“tooth”其实只需要3个字节即可店面虽然看着挺大的。对应代码如下:selectvchar,length(vchar)asvcharlen测试接口链接:utf8mb4字符集兼容性测试接口如果要写4字节的汉字,可以从龙泉寺提供的字库中复制,或者插入表情符号图释。参考和延伸阅读HowtotransferUTF8charactersettablesdirectlytoUTF8MB4FAQ系列-调用存储过程时非法混合排序规则听说JOIN的列类型必须相同https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-conversion.htmlhttps://dev.mysql.com/doc/refman/5.7/en/cast-functions.htmlhttp://imysql.com/charset_tipshttp://imysql.com/utf8mb4/utf8mb4.phphttp://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.htmlhttp://www.imkevinyang.com/2010/06/关于字符编码,什么你需要知道.html
