MySQL乱码问题深层分析

作者:尹斌斌 来源:IT168 时间:2009-03-09 14:53:00 

一、概述

公司新购了一批PC,准备把几个性能较优的PC升级为数据库服务器,替换老旧的机器。公司有套POS终端软件,后台数据存储是 MySQL 3.23 版。我准备硬件升级的同时升级数据库软件。但是升级过程中遇到闻名的 MySQL 的乱码问题。经过查找资料,加上自己的摸索和经验,终于完美地解决这个问题。

MySQL 的乱码问题(不仅仅包括中文乱码,也包括其它语言的乱码,以下称之为乱码问题)只存在于4.1及其以上版本。4.1之前的 MySQL 不支持多语言,所以它会将你给它的数据“原封不动”地保存,再“原封不动”地读出来。从字节的角度来看,数据在这一过程中不会产生任何变化,因此不会有乱码。

4.1及以后的版本开始支持多语言,这个所谓的多语言,就是在输入输出时 MySQL 会替你做编码转换。而这个转换规则就是由客户端编码和服务器端编码来决定的。

编码转换的规则就是,在输入数据时将编码由“客户端编码”转换为“服务器端编码”,输出时将数据由“服务器端编码”转换为“客户端编码”。

二、乱码产生原因

MySQL 字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其它大多数数据库管理系统。正因为这一特性才导致 MySQL 的乱码问题。

字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。让我们使用一个假想字符集的例子来区别清楚。

假设我们有一个字母表使用了四个字母:‘A’、‘B’、‘a’、‘b’。我们为每个字母赋予一个数值:‘A’=0,‘B’= 1,‘a’= 2,‘b’= 3。字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集。

假设我们希望比较两个字符串的值(在if……else语句中我们经常做值的比较):‘A’和‘B’。比较的最简单的方法是查找编码:‘A’为0,‘B’为1。因为0 小于1,我们可以说‘A’小于‘B’。我们做的仅仅是在我们的字符集上应用了一个校对规则。校对规则是一套规则(在这种情况下仅仅是一套规则):“对编码进行比较。”我们称这种全部可能的规则中的最简单的校对规则为一个binary(二元)校对规则。

但是,如果我们希望小写字母和大写字母是等价的,应该怎样?那么,我们将至少有两个规则:(1)把小写字母‘a’和‘b’视为与‘A’和‘B’等价;(2)然后比较编码。我们称这是一个大小写不敏感的校对规则。比二元校对规则复杂一些。

在实际生活中,大多数字符集有许多字符:不仅仅是‘A’和‘B’,而是整个字母表,有时候有许多种字母表,或者一个东方的(比如中文、日文、韩文、藏文、泰文等等)使用上千个字符的书写系统,还有许多特殊符号和标点符号。并且在实际生活中,大多数校对规则有许多个规则:不仅仅是大小写不敏感,还包括重音符不敏感(“重音符” 是附属于一个字母的符号,象德语的‘?’符号)和多字节映射(例如,作为规则‘?’=‘OE’就是两个德语校对规则的一种)。

(以上摘自MySQL 5.1 手册。更多内容可参见:http://dev.mysql.com/doc/refman/5.1/zh/charset.html)

标签:MySQL,乱码,编码,分析
0
投稿

猜你喜欢

  • PyTorch的torch.cat用法

    2023-11-26 08:57:32
  • Oracle下时间转换在几种语言中的实现

    2009-02-28 11:09:00
  • Python实现合并同一个文件夹下所有PDF文件的方法示例

    2021-01-21 23:08:18
  • Python 分支结构详解

    2021-03-17 01:43:06
  • Matlab求解数组中的最大值及它所在的具体位置

    2023-08-11 18:55:11
  • k8s在go语言中的使用及client 初始化简介

    2024-02-03 18:10:51
  • MYSQL初学者使用指南[适用自己安装mysql者]

    2007-08-06 14:53:00
  • python语言线程标准库threading.local解读总结

    2023-12-22 18:18:07
  • pytorch 实现计算 kl散度 F.kl_div()

    2023-04-03 20:16:18
  • win10下Python3.6安装、配置以及pip安装包教程

    2022-09-27 12:29:46
  • JavaScript的目的及历史

    2007-10-17 18:53:00
  • 解析Golang中的GoPath和GoModule

    2024-05-09 14:56:48
  • 通过cmd进入python的步骤

    2022-05-27 05:23:31
  • php链式操作mysql数据库(封装类带使用示例)

    2023-05-25 02:58:22
  • go中import包的大坑解决方案

    2024-05-09 09:55:14
  • 程序员的七夕用30行代码让Python化身表白神器

    2023-10-26 12:27:41
  • Go语言从单体服务到微服务设计方案详解

    2023-09-02 02:45:57
  • 网页用多宽才更合适?

    2009-04-07 14:07:00
  • python tkinter的消息框模块(messagebox,simpledialog)

    2022-12-30 15:19:23
  • 有时用户并不需要引导

    2009-07-17 18:48:00
  • asp之家 网络编程 m.aspxhome.com