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 4.1.x开始支持以下这些事情
l 使用多种字符集(Character Set)来存储字符
l 使用多种校对规则(Collation)来比较字符串
l 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串
l 允许定义任何级别的字符集和校对规则
MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。 字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。
MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:
MySQL的字符集处理是这样的:
1、发送请求。
1)客户端发送请求到服务器端。
2)服务器端会把请求的数据从客户端字符集(character_set_client)转成服务器连接字符集(character_set_connection)。
3)然後服务器会检测存储区域(table,column)的字符集,然后把数据从连接字符集(character_set_connection)转为存储区域(table,column)的字符集,然後再存储或者查询。
2、返回请求。
1)服务器将存储区域(table,column)的字符集转换成服务器连接字符集(character_set_connection)。
2)将服务器连接字符集(character_set_connection)转换成结果字符集(character_set_results),再发送到客户端。
例如,我建立一个字符集为 gbk 的数据库(服务器端)。(MySQL 4.1 开始,在建立数据库时要指定它的字符集和校对规则,不指定就用默认的字符集和校对规则。)
连接数据库的程序(客户端)使用 gb2312 字符集(如 windows 命令行下使用 MySQL ,或者 PHP 连接MySQL ),那么在执行 insert 命令时,insert 的字符串将做一个 gb2312 到 gbk 的转换。而 select 时,数据库中保存的数据会先经过 gbk 到 gb2312 的转换之后再给你(结果集)。
好,那么为什么升级3.23(或4.0)到4.1时会乱码?举个例子说明。
例如3.23的数据库中保存的是gbk编码的数据。升级之前我将这些数据导出保存到文件里,这个文件的编码当然也是gbk的(因为3.23不支持多语言,不会对数据进行转换,也就是前面说的“原封不动地保存,原封不动地读出”)。
然后我在4.1中建立一个数据库,字符集为A;客户端字符集为B。将刚才的gbk数据导入。
1)A=gbk,B=gbk
导入数据时数据不会被转换;读出时需要set names gbk(set name命令下面将讲解)。
2)A=latin1,B=gbk
导入数据会进行gbk->latin1的转换,可能会丢失数据,产生乱码。
3)A=gbk,B=latin1
导入数据会进行latin1->gbk转换,可能会产生乱码。
4)A=latin1,B=latin1
导入数据时不会进行转换;读出时不需要set names gbk 。
大家可以看到,上面1)、4)才是正确的做法,即让A和B使用同样的字符集才不会乱码。
Linux删除乱码文件
通过 css 来实现一段不停变化的 bug 乱码效果。
MySQL出现乱码的原因要了解为什么会出现乱码,我们就先
在安装jforum和ssh整合时,用到mysql都出现汉字乱码,试了许多情况,最后方便,会出现在选 择utf8时,没有选中要设置 的选 项。
MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法近日发现很多人为MySQL中文乱码问题所困扰。于是就这个问题做一下浅析。不正确的地方希望大家指正作者:我不是鱼乱码产生原因 mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统。我们可以在MySQL Command Line Client 下输入如下命令查看mysql的字符集mysq
现象: mysql的默认编码设置为utf-8,页面以utf-8的编码方式写入到数据库。用工具查看一切正常,但从mysql的命令行读数据出来总是乱码。原因: mysql的客户端根本无法以utf-8的形式返回数据。windows下命令行的默认属性为GBK。mysql中关于字符集的种类有很多,对我们编程有影响的主要是客户端字符集(character_set_client)和数据库字符集(ch
Mysql中文乱码问题之前被mysql中总是出现中文乱码搞得云里雾里,在网上也搜了些相关资料,可结果更让我觉得字符集的转换是相当复杂,甚至有了抵触心理,不过还好在最后搜到几篇经典的文章,经过研读总算明白过来!好文章,不敢独享,现将文章稍作整理与大家分享。mysql中文乱码原因剖析:对编程有影响的主要是客户端字符集和数据库字符集,数据库中常用的操作就是保存数据和读取数据,在这个过程中,乱不乱码和数据
MySQL乱码的具体原因和如何设置UTF8数据格式作者:三月本文主要给大家介绍MySQL乱码的具体原因和如何设置UTF8数据格式,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下MySQL乱码的具体原因和如何设置UTF8数据格式吧。MySQL使用时,有一件很痛苦的事情肯定是结果乱码。将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为什
GB2312和UTF-8两个字符集的区别: GB2312是标准中文字符集,UTF-8 是UNICODE 的一种变长字符编码,即RFC 3629,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。UTF-8 是字节顺序无关的,它的字节顺序在所有系统中都是一样的,排序更加容易。因此 UTF-8 具有更高的性能。不过如果是纯英文的话,用什么都可以,用GB2312也没问题。 MYSQL+
本文描述了在基于JSP +MySQL构建网站时,发生网页中文显示为乱码情况的解决办法。最终希望使用的编码是:统一的UTF-8编码。试验网站的开发运行环境:OS: Ubuntu 12.04 及 Windows 7IDE: eclipse, Juno Service Release 2Web Server: Tomcat 7.0.27DataBase: MySQL 5.5.29本文的一些观点应该也能
MySQL之所以会乱码,无非是以下几种原因:1、存进数据库之前就乱码2、在存进数据库过程中乱码3、存进数据库后乱码想知道在哪里出现乱码很简单,在后台打印一下就知道了。既然知道问题出在哪里,那解决方法也很简单:1、jsp设置编码是utf-8,保证传到后台的是utf-8的编码2、将传到后台的请求的参数转为utf-8的编码。至于使用哪种方法,可以使用spring的拦截器,也可以自己写一个,也可以手动转换
1.编码的产生:我们的存储的基本单元是一个byte字节,然而人类的语言太多,无法用一个基本单元来表示,然而为了拆分或者一些相应的翻译工作,导致了编码的产生 2.常见的编码格式ASCll :用一个字节的低7位共128个来表示,0-31表示控制字符,32-126表示打印字符, ASCll的二进制第一位也就是最高位,目的是用来做奇偶检验的,所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误
MySQL出现乱码的原因有很多,一般与character_set参数有关。我们先来看看有哪些参数:SHOW VARIABLES LIKE "character%";Variable_name Valuecharacter_set_client utf8character_set_connection utf8character_set_database utf8char
(一)、Mysql自4.1以后,增加了对字符集的支持。笔者之前对Mysql比较了解,刚接触4.1时,感觉Mysql有点多此一举,但后来细想发现,对字符集的支持,虽然对开发者来说,会麻烦一些,但不可否认,是一种进步。对字符集的支持,不仅更加支持多语言,而且,也方便移植。 刚开始使用Mysql4.1,你可能感觉有点不适,下面,简单阐述一下笔者对Mysql4.1字符集的理解,再讲述如何PHP如何适应My
mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码。今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码。在这里,我分享下具体问题的排查过程,以及解决的办法。(1) 排除客户端设置导致的显示乱码如果用户设置的mysql character_set_client跟客户端显示的字符集不一致,很容易导致中文数据乱码。设置session
随着我国城镇化进程的加速和环保政策的日趋严格,城市及乡镇污水处理厂的稳定运行与高效监管变得至关重要。传统的污水处理厂在安全管理与生产监管方面普遍面临以下痛点: 设备分散,监管困难:厂区范围大,各类池体、泵站、机房等关键设备分布广泛,人工巡检效率低、成本高。 视频系统孤立:可能部署了不同品牌、不同协议 ...
嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。免费订阅,与10万+技术人共享升级秘籍! n8n-MCP 是 n8n 的“智能中间件”:它向大模型(如 Claude Desktop / Claude Code / Cursor)提供结构 ...
MCP3421是一款18位高精度Σ-Δ模数转换器(ADC),它通过I2C接口与微控制器通信,能够实现高精度的电压测量。基于STM32和MCP3421的电压采集代码,包含初始化和读取数据的步骤,代码基于STM32的HAL库进行开发。 MCP3421与STM32电压采集实现 MCP3421是一款高精度、 ...