深入Mysql字符集设置

深入MySQL字符集设置分析 MySQL是一个常用的关系型数据库管理系统,它支持多种字符集用于存储和处理不同语言的数据。本文将深入分析MySQL字符集设置的相关内容,并提供相应的源代码示例。在MySQL中,字符集用于定义存储和处理文本数据的规则。除了数据库和表级别的字符集设置,还可以在连接级别设置字符集。MySQL服务器和客户端可以使用不同的字符集进行通信。除了在数据库级别设置字符集,还可以在表级别设置字符集。可以在创建数据库时指定字符集,也可以在已存在的数据库上修改字符集。这样,客户端发送给服务器的数据将使用指定的字符集进行编码。 阅读详情

基本概念 
• 字符(Character)是指人类语言中最小的表义符号。例如'A'、'B'等; 
• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符'A'赋予数值0,给字符'B'赋予数值1,则0就是字符'A'的编码; 
• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{'A','B'}时,{'A'=>0, 'B'=>1}就是一个字符集; 
• 字符序(Collation)是指在同一字符集内字符之间的比较规则; 
• 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系; 
• 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation); 
• MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序``utf8_general_ci''下,字符``a''和``A''是等价的; 
MySQL字符集设置 
• 系统变量: 
– character_set_server:默认的内部操作字符集 
– character_set_client:客户端来源数据使用的字符集 
– character_set_connection:连接层字符集 
– character_set_results:查询结果字符集 
– character_set_database:当前选中数据库的默认字符集 
– character_set_system:系统元数据(字段名等)字符集 
– 还有以collation_开头的同上面对应的变量,用来描述字符序。 
• 用introducer指定文本字符串的字符集: 
– 格式为:[_charset] 'string' [COLLATE collation] 
– 例如: 
• SELECT _latin1 'string'; 
• SELECT _utf8 '你好' COLLATE utf8_general_ci; 
– 由introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。 
MySQL中的字符集转换过程 
1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection; 
2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下: 
• 使用每个数据字段的CHARACTER SET设定值; 
• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准); 
• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值; 
• 若上述值不存在,则使用character_set_server设定值。 
3. 将操作结果从内部操作字符集转换为character_set_results。 

 
常见问题解析 
• 向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8 

– 插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1; 

– 插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存; 

– 查询时的结果将经过utf8=>utf8的字符集转换过程,将保存的6个字节原封不动返回,产生乱码…… 

• 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8 

– 插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8; 

– 插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有/u0000~/u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。 

检测字符集问题的一些手段 
• SHOW CHARACTER SET; 

• SHOW COLLATION; 

• SHOW VARIABLES LIKE 'character%'; 

• SHOW VARIABLES LIKE 'collation%'; 

• SQL函数HEX、LENGTH、CHAR_LENGTH 

• SQL函数CHARSET、COLLATION 

使用MySQL字符集时的建议  
• 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰; 

• 数据库和连接字符集都使用latin1时虽然大部分情况下都可以解决乱码问题,但缺点是无法以字符为单位来进行SQL操作,一般情况下将数据库和连接字符集都置为utf8是较好的选择; 

• 使用mysql C API时,初始化数据库句柄后马上用mysql_options设定MYSQL_SET_CHARSET_NAME属性为utf8,这样就不用显式地用SET NAMES语句指定连接字符集,且用mysql_ping重连断开的长连接时也会把连接字符集重置为utf8; 

• 对于mysql PHP API,一般页面级的PHP程序总运行时间较短,在连接到数据库以后显式用SET NAMES语句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集。 

其他注意事项  
• my.cnf中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用! 

• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。 

• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!/P>

在 mysql客户端与 mysql服务端之间,存在着一个字符集转换器。
 
character_set_client          =>gbk:转换器就知道客户端发送过来的是gbk格式的编码
character_set_connection=>gbk:将客户端传送过来的数据转换成gbk格式
character_set_results        =>gbk:
 
注:以上三个字符集可以使用set names gbk来统一进行设置
例子:
create table test(
name varchar(64) NOT NULL
)charset utf8;#这里的utf8表示服务器端的字符编码
 
首先,往数据表test中插入一条数据
inert into test values('测试');
则,数据“测试”在数据库中是以“utf8”格式保存的
过程:

 
首先,通过mysql客户端,将数据发送给Mysql服务器,经过字符集转换器的时候,由于character_set_connection 值为gbk,所以会将客户端发送过来的数据转为gbk格式,紧接着,字符集转换器将数据要传送给服务器的时候,发现服务器是以utf8保存数据的,所以,在其内部会自动将数据由gbk转换成utf8格式
 
 
什么时候会出现乱码?
  1. 客户端的数据格式与声明的 character_set_client不符
        通过 header('Content-type:text/html;charset=utf8');将客户端的数据转成utf8格式的,在数据经过“字符集转换器”的时候,由于character_set_client=gbk,而character_set_connection也等于gbk,所以从客户端传送过来的数据(其实是utf8格式)并不会被转换格式。
        但是,字符集转换器在讲数据发送给服务器的时候,发现服务器要的格式是utf8,所以会将当前数          据当做gbk格式来处理,从而转成utf8(但是,这一步其实已经错了。。。)。
    2.  result与客户端页面不符合的时候
        

 将返回结果的格式设置为utf8,但是客户端接受的格式为gbk,因此会出现乱码
 

通过show character set 语法,可以显示所有可用的字符集
latin字符集

注意:Maxlen列显示用于存储一个字符的最大的字节数目。
 
utf8字符集

 
gbk字符集

 
什么时候会丢失数据?
对比以上三幅图可以知道,每种字符集中,用于存储一个字符的最大的字节数目都不同,utf8最大,latin最小。所以在经过字符集转换器的时候,如果处理不当,会造成数据丢失,而且是无法挽回的。
比如:
将character_set_connection的值改为lantin的时候

从客户端发送过来的gbk数据,会被转成lantin1格式,因为gbk格式的数据占用的字符数较多,从而会造成数据丢失
 

总结:
  1. character_set_client和character_set_results 一般情况下要一致,因为一个表示客户端发送的数据格式,另一个表示客户端接受的数据格式为了避免造成数据丢失,需让 character_set_connection的字符编码 大于 character_set_client的字符编码
MySQL字符集与字符序设置 在多语言应用场景中,字符集和字符序的合理设置不仅仅是对数据存储的要求,更是提升用户体验和系统稳定性的关键因素。通过灵活选择和调整字符集,游戏系统能够确保在不同语言环境下的数据统一性与可操作性,而恰当的字符序则能在全球范围内实现一致的排序和比较操作。无论是创建全新数据库时选择合适的字符集,还是在已有数据中进行字符集的转换与优化,理解并掌握这些技术细节能够为开发者带来更大的灵活性,也为项目的国际化铺平道路。 阅读详情

相关推荐

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

mysql_set_charset

mysql_set_charset()是最方便的mysql字符设置函数,另mysql下没有utf-8字符集,只有utf8字符集; 例: mysql_set_charset('gbk'); mysql_set_charset('utf8');

无效的博客 7851

PDN设计

作者:AirCity 2020.2.6 Aircity007@sina.com 本文所有权归作者Aircity所有 PDN设计的目的是降低电源纹波水平,减小电压跌落。我们通常要求LDO的文波水平是30mV,DCDC是50mV,超过这个就需要PDN设计。 PDN设计的方法是用不同的容值,合适的总电容量,降低电源平面与地平面之间的交流阻抗,确定容值总量和电容大小的过程,就是PDN设计过程。 为什么需...

AirCity123的博客 4146

mysql set names utf_SQL注入攻击之 mysql_set_charset而mysql_query("Set Names utf8")存在一定...

本文转载地址:http://hi.baidu.com/cuttinger/blog/item/e9a93901934755147bec2cb0.html1。老话题,mysql_real_escape_string+单引号,大多数情况下,防止sql注入攻击足够了。$mysql = mysql_connect("host","user","passwort");$value = mysql_real...

weixin_35578119的博客 316

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 792

使用 Python 获取实时港股行情数据

在本教程中,你将学习如何通过 Infoway API 获取港股实时行情数据,具体以腾讯控股(0700.HK)和汇丰控股(0005.HK)为例,使用 Python 进行数据请求和解析。

kk_stoper的博客 1515

php mysql mysql_set_charset()._PHP:MySQL函数mysql_set_charset()的用法

mysql_set_charset(PHP 5 >= 5.2.3)mysql_set_charset — 设置客户端的字符集本扩展自 PHP 5.5.0起已废弃,并在将来会被移除。应使用 MySQLi或 PDO_MySQL 扩展来替换之。参见MySQL:选择 API 指南以及相关 FAQ 以获取更多信息。用以替代本函数的有:mysqli_character_set_name()PDO: 添加...

weixin_39676021的博客 423

Codex CLI 手机号验证失败?5 种接码平台实测对比与绕过地区限制的 3 步操作

揭示 Codex CLI 手机号验证失败的真实原因在于上下文污染而非网络问题,分析其通过 ASN、Accept-Language 和 TLS SNI 三重加权风控的机制,并实测对比 5 种接码平台在 DNS 解析路径、ASN 干净度和复用间隔上的差异,提出剥离浏览器指纹、固化 TLS SNI、隔离

weixin_42627902的博客 730

mysql mysql_set_charset_深入理解mysql SET NAMES和mysql(i)_set_charset的区别

说到, 尽量使用mysqli_set_charset(mysqli:set_charset)而不是”SET NAMES”, 当然, 这个内容在PHP手册中也有叙及, 但是却没有解释为什么.最近有好几个朋友问我这个问题, 到底为什么?问的人多了, 我也就觉得可以写篇blog, 专门介绍下这部分的内容了.首先, 很多人都不知道”SET NAMES”到底是做了什么,我之前的文章深入MySQL字符集设置中...

weixin_31319319的博客 786

【视频】GStreamer+WebRTC(九):使用NVIDIA硬编解码

2)下载 GStreamer-bad 插件包源码注意要下载和 GStreamer版本对应的插件包3)下载NVIDIA硬编解码SDK最新的SDK下载地址注意 GStreamer 1.24.2 中调用的 NVIDIA Video_Codec_SDK 不是最新的,先使用下面的方法,查看gst-plugins-bad-1.24.2.tar.xz 对应的NVIDIA Video_Codec_SDK 的版本是多少。

郭老二 261

基于PyQt5和OpenCV的传统图像分割应用UI程序

主要功能包括:加载和显示图像应用多种图像分割算法调整算法参数保存处理结果。

Henry的博客 471

MySQL字符集的设置

Notice:文章基于ubuntu系统而写 1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面:   字符集(Character set)和排序方式(Collation)。 MySQL对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。 MySQ

让梦想从这里起飞…… 4万+

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

mysql怎么查看字符集设置_mysql 设置查看字符集

一、查看字符集1.查看MYSQL数据库服务器和数据库字符集方法一:show variables like '%character%';方法二:show variables like 'collation%';2.查看MYSQL所支持的字符集show charset;3.查看库的字符集语法:show database status from 库名 like 表名;4.查看表的字符集语法:show ...

weixin_42502295的博客 6021

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL字符集设置

一、 MySQL字符集设置 (1)系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – character_set_connection:连接层字符集 – character_set_results:查询结果字符集 – character_set_database:当前

AI论道的博客 3724

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

深入mysql字符集设置,深入Mysql字符集设置[精华结合]

深入Mysql字符集设置[精华结合]深入Mysql字符集设置[精华结合]基本概念? 字符(Character)是指人类语言中最小的表义符号。例如'A'、'B'等;? 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符'A'赋予数值0,给字符'B'赋予数值1,则0就是字符'A'的编码;? 给定一系列字符并赋予对应的编码后,所有...

weixin_42510407的博客 211

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mysql c 重连 字符集_Mysql字符集设置详解

一,Mysql字符集的基本概念字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等;给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,给字符’A'赋予数值0,给字符’B'赋予数值1,则0就是字符’A'的编码;给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)...

weixin_31526891的博客 129

mysql 设置字符集的命令_mysql字符集设置

注意:从windows下拷贝过来的文件在linux下不能直接加入数据库,因为字符集不一样,这样打开即使显示是中文也不能在数据库中显示,要把文件拷贝进linux的另一个文件中转换字符才可以。MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令。包括查看 MySQL 数据库服务器字符集、查看 MySQL 数据库字符集,以及数据表和字段的字符集、当前...

weixin_36337122的博客 1383

MySql·设置字符集编码

MySql·设置字符集编码 查看版本号 SELECT version(); 查看数据库的字符编码 命令行登录数据库 输入: \s 查看字符编码明细 show variables like '%char%'; 设置默认字符集(在mysql的安装目录的my.ini文件中设置) [mysqld] # 设置3306端口 port=3306 # 设置mysql的安装目录 (如果移动了数据库的目录,需要重新配置数据库的路径地址) basedir=E:\java_tools\mysql-5.7.36-winx64 #

qq_43308318的博客 2687

mysql 字符集设置

一、 MySQL字符集设置 (1)       系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – character_set_connection:连接层字符集 – character_set_results:查询结果字符集 – character_set_database:当前

程序猿老樊的博客 4704

设置和修改MySQL字符集

上面的命令将数据库字符集设置为utf8mb4,排序规则设置为utf8mb4_unicode_ci。在上述命令中,将’table_name’替换为表的实际名称,'column_name’替换为要修改的列的实际名称。上面的命令将指定列的字符集设置为utf8mb4,排序规则设置为utf8mb4_unicode_ci。上面的命令将表的字符集设置为utf8mb4,排序规则设置为utf8mb4_unicode_ci。上述命令将当前连接的字符集设置为utf8mb4,排序规则设置为utf8mb4_unicode_ci。

TeiGradient的博客 1834

mysql中设置字符集语句_MYSQL字符集设置的方法详解(终端的字符集)

前言每次利用终端 创建数据库或者创建表的时候,字符集都是latin1,或者进行插入值的时候,显示的是乱码(不指定字符集的时候)如下:查看当前数据库的字符集character_set_client:客户端请求数据的字符集character_set_connection:客户机/服务器连接的字符集character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;...

weixin_35988065的博客 2802

设置mysql字符集_Mysql字符集设置

最近,在项目组使用的mysql数据库中,插入数据出现乱码,关于这个问题做了下总结,我们从最基本的地方说起,到错误产生的深层次原因和解决办法。基本概念• 字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等;• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A'赋予数值0,给字符’B'赋予数值1,...

weixin_35120567的博客 352
上一篇: linux 查看文件(夹)大小
下一篇: Shell字符串匹配
sofia1217
博客等级 码龄17年 36粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值