-
字符编码的产生背景
- 在计算机内部,所有数据都是以二进制形式存储的
- 不同的国家/语言有自己的文字符号,需要使用编码将其映射为计算机可识别的二进制
- 最早的ASCII码只支持128个字符,无法满足多语种需求,促进了多种字符编码的出现
-
常见的单字节编码和多字节编码
- 单字节编码:ASCII、ISO-8859、Latin-1等,每个字符占一个字节,最多只能表示256个符号
- 多字节编码:GBK、GB18030、Big5、UTF-8等,每个字符占1-4个字节,可表示更多符号
-
Unicode的提出及重要性
- Unicode旨在统一全球所有文字的编码,目前已超过12万个字符
- UTF-8、UTF-16等编码方案是基于Unicode,充分兼容了全球多语种
- Unicode极大推动了多语种软件的发展和数据交换
-
常见字符编码的对比
- ASCII: 只能表示英文,编码最简单
- Latin-1: 保留ASCII原编码,增加一些西欧字符
- GBK: 常用汉字只需两个字节,生僻字需四个字节
- UTF-8: 向后兼容ASCII,对英文只需一个字节,汉字通常三个字节
- UTF-16: 固定两个字节或四个字节编码大多数字符
-
常见编码问题及应对措施
- 乱码问题:通常由编码不一致导致,需要统一使用相同编码
- 中文路径问题:Windows默认GBK,Linux默认UTF-8,需要特殊处理
- 数据存储问题:在字符串存储前,先要进行字符编码转换(如到UTF-8)
- 字符编码维护:系统/库/表/列都可设置默认编码,需要明确定义
总的来说,字符编码是实现多语言数据存储和交换的重要基础,不同编码有不同的字符表示范围、编码规则和应用场景。选择一个合适的编码非常关键,尤其在多语种环境下,更要注意编码的统一性和正确性,从而避免乱码问题。对于程序员和运维人员来说,理解和掌握字符编码知识都是必备的。
MySQL支持多种字符编码,不同的编码对应不同的字符集,主要区别在于所能表示的字符范围。常见的编码及区别如下:
-
GB2312
- 简体中文编码,使用两个字节表示一个汉字
- 收录了6763个汉字,只能表示中文基本字符
-
GBK
- 扩展的GB2312编码,向下兼容GB2312
- 使用两个字节表示常用字,使用四个字节表示生僻字
- 收录21003个汉字,基本覆盖所有常用汉字
-
GB18030
- 最新的国家标准编码,是GBK的超集
- 每个字符使用1-4个字节表示
- 收录了70244个汉字,包含中文、满语、藏语、维吾尔语等多种文字
-
UTF-8
- 国际通用编码,兼容ASCII
- 变长编码,每个字符使用1-4个字节表示
- 收录超过100多万个字符,包括世界绝大部分文字系统
-
UTF-16
- 万国码的辅助编码,用两个字节或四个字节表示一个字符
- 可表示全部Unicode字符
-
Latin1
- 单字节编码,支持西欧常用语种
-
Binary
- 存储二进制字符串,允许存储全部字节值
还有其他一些编码如big5(台湾繁体)、euckr(韩语)、koi8r(俄语)等。
在MySQL中,可以为整个实例、单个库、单个表、甚至单个列指定不同的字符编码。通常建议:
- 对新应用使用UTF-8编码,向下兼容,能表示各种文字
- 对已有应用,根据数据文本的语种选择合适编码
- 同一个系统中不要混合使用多种编码以免出现乱码