輝灬緈冨 發表於 2025-12-29 16:59:00

MySQL 5.7.x版本修改字符集(Win11环境)

<h2 id="1前置问题">1.前置问题</h2>
<ul>
<li>
<p>mysql5.7.*版本默认使用的字符集是<code>latin1</code>(拉丁文),当添加中文数据时,出现字符串值不正确。<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229154536045-1047973749.png"></p>
</li>
<li>
<p>mysql5.7.*版本默认使用<code>latin1</code>,是因为MySQL是由瑞典人开发的,所以默认使用欧洲的字符集。</p>
</li>
<li>
<p>查看数据表和数据库的默认字符集<br>
<strong>数据表:</strong><br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229154725132-1487412505.png"><br>
<strong>数据库:</strong><br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229154753020-841349237.png"></p>
</li>
<li>
<p>查看所有变量的字符集<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229155222151-1893196671.png"><br>
其中:<br>
character_set_client:服务器解码请求时使用的字符集<br>
character_set_connection: 服务器处理请求时会把请求字符串从character_set_client转character_set_connection<br>
character_set_database: 当前数据库的字符集<br>
character_set_server: 服务器级别的字符集</p>
</li>
</ul>
<p>character_set_results: 服务器香客户端返回数据时使用的字符集。其中:服务器级别的字符集和当前数据库的字符集可能不一样。</p>
<ul>
<li>校对所有字符集<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229155432182-184577872.png"></li>
</ul>
<h2 id="2修改服务器级别的默认字符集">2.修改服务器级别的默认字符集</h2>
<p>找到MySQL的数据文件存储目录,找到<code>my.ini</code>文件并打开。<br>
一般数据文件存储目录默认安装在<code>C:\ProgramData\MySQL\MySQL Server 5.7</code>,否则在自定义存储目录查看。</p>
<ol>
<li>在文件找到 <code></code> ,在下方添加:</li>
</ol>
<pre><code class="language-txt">
# 默认字符集
default-character-set=utf8
</code></pre>
<ol start="2">
<li>在文件找到 <code></code>,在下方添加:</li>
</ol>
<pre><code class="language-txt">
character-set-server=utf8
collation-server=utf8_general_ci
</code></pre>
<ol start="3">
<li>最后使用命令重启MySQL服务使配置生效(重启需要管理员权限)</li>
</ol>
<pre><code class="language-cmd">C:\Windows\System32&gt;net stop MySQL57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。


C:\Windows\System32&gt;net start MySQL57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
</code></pre>
<p>也可以在windows服务列表中找到MySQL服务进程重启,简单易懂。</p>
<ol start="4">
<li>
<p>再次查看字符集&amp;系统变量<br>
查看修改字符集之前创建的数据库和表还是使用之前默认的字符集:<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229162425324-47549034.png"><br>
查看修改字符集之后创建的数据库和表使用的字符集:<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229164538992-759884358.png"><br>
查看修改后系统变量字符集:<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229164731941-884214836.png"></p>
</li>
<li>
<p>验证插入中文数据<br>
<img src="https://img2024.cnblogs.com/blog/3382744/202512/3382744-20251229164916092-732443816.png"></p>
</li>
</ol>
<h5 id="在myini中添加默认字符集之前已创建的数据库和数据表如何修改默认字符集">在my.ini中添加默认字符集之前已创建的数据库和数据表如何修改默认字符集?</h5>
<p>方式1:直接删除数据库和表,重新创建</p>
<pre><code class="language-sql"># 删除数据表
mysql&gt; delete from table_name;
# 或
mysql&gt; drop table table_name;
# 删除数据库
mysql&gt; drop database db_name;
</code></pre>
<p>方式2:数据表级别的默认字符集</p>
<pre><code class="language-sql"># 修改表的默认字符集为utf8
# 语法如下:
# ALTER TABLE 表名(列的信息)
#[ CHARACTER SET 字符集名称]
#[ COLLATE 比较规则名称]
mysql&gt; alter table table_name convert to character set utf8;
# 或
mysql&gt; alter table table_name charset utf8;

# 查看数据表的默认字符集
mysql&gt; show create table table_name;
</code></pre>
<p>方式3:数据库级别的默认字符集</p>
<pre><code class="language-sql"># 修改数据库的默认字符集,同时更改校对
mysql&gt; alter database dbtest1 character set utf8 collate utf8_general_ci;

# 查看数据库的默认字符集
mysql&gt; show create database db_name;
</code></pre>
<p>方式4:列级别的默认字符集</p>
<pre><code class="language-sql"># 修改列的字符集(一般不需要)
# 语法如下:
# ALTER TABLE 表名 MODIFY COLUMN 列名 字符串类型 ;
mysql&gt; alter table employees modify column name varchar(10) character set utf8 collate utf8_general_ci;
</code></pre>
<blockquote>
<p>最佳实践:设定服务器级别的编码是utf8即可,数据库以及数据表保持一致。</p>
</blockquote>
<h2 id="3-字符集和比较规则">3. 字符集和比较规则</h2>
<h4 id="31-utf8与utf8mb4">3.1 utf8与utf8mb4</h4>
<p>UTF-8 是一种变长的字符编码,它是 Unicode 的一种实现方式。在 UTF-8 编码中,每个字符可以使用 1 到 4 字节来表示,但是我们常用的一些字符使用1~3 个字节就可以表示了,UTF-8 编码的最大特点是向后兼容 ASCII,即所有标准的 ASCII 字符(U+0000 到 U+007F)仍然使用 1 字节表示。</p>
<p>UTF-8 能够表示几乎所有的语言字符,并且它已经成为 Web 上最广泛使用的字符编码标准。</p>
<p>1 字节:ASCII 字符(0x00 到 0x7F)<br>
2 字节:较常见的字符,如拉丁字母、汉字等(0x80 到 0x7FF)<br>
3 字节:扩展字符,如一些汉字和其他中等使用频率的字符(0x800 到 0xFFFF)<br>
4 字节:稀有字符,如表情符号、一些少数民族的字符等(0x10000 到 0x10FFFF)</p>
<p>UTF-8MB4 是 UTF-8 的一个增强版,支持完整的 Unicode 字符集,最大支持 4 字节的字符。它可以存储任何 Unicode 字符,包括一些特殊字符,如表情符号、古代文字等。</p>
<p>4 字节:UTF-8MB4 引入了对超过 3 字节字符(例如表情符号和一些少数民族的字符)的支持,这些字符超出了 UTF-8 的支持范围,因此需要使用 4 字节来存储。<br>
在 MySQL 中,UTF-8 实际上并没有完全遵循 Unicode 标准,最多支持 3 字节的字符,而 UTF-8MB4 解决了这个问题,提供了完整的 Unicode 支持。</p>
<p><strong>在 MySQL 中使用 UTF-8 和 UTF-8MB4</strong></p>
<p>虽然字符集表示一个字符所用的最大字节长度,但在某些方面会影响系统的存储和性能,所以MySQL的设计者偷偷定义了两个概念:</p>
<ul>
<li>
<p><code>utf8mb3</code> : 阉割过的utf8字符集,只使用1~3 个字节表示字符。在MySQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1~3个字节表示一个字符。</p>
</li>
<li>
<p><code>utf8mb4</code>: 正宗的utf8字符集,使用1~4个字节表示字符。</p>
</li>
</ul>
<p><code>utf8</code> 的字符集对于很多应用来说已经足够,但随着应用程序和网站逐渐支持表情符号和更多的 Unicode 字符(例如古代文字、特殊符号),<code>utf8</code> 已经不再能满足所有需求。</p>
<p>而<code>utf8mb4</code> 完全支持 Unicode 标准,特别是对于现代 Web 应用,支持表情符号和特殊符号的需求越来越高。例如,社交平台、聊天应用、用户评论等都需要能够处理表情符号和其他特殊字符。</p>
<p>因此,如果你的应用中包含用户输入的文本(例如社交网络、即时消息系统等),使用<code>utf8mb4</code>是更加推荐的选择。</p>
<p>所以MySQL官方从MySQL 8.0.28开始使用<code>utf8mb4</code>作为默认字符集,MySQL 从 ‌5.5.3‌ 版本开始引入并支持 <code>utf8mb4</code> 字符集,但MySQL 5.x还是使用<code>latin1</code>作为默认字符集。<br>
<strong>查看MySQL支持的所有字符集:</strong></p>
<pre><code class="language-sql">mysql&gt; show charset;
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3382744/202601/3382744-20260127234651561-292209594.png"></p>
<h4 id="32-比较规则">3.2 比较规则</h4>
<p>如上图中,MySQL版本一共支持41种字符集,其中的 <code>Default collation</code> 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如:<code>utf8_polish_ci</code> 表示以波兰语的规则比较, <code>utf8_general_ci</code> 是一种通用的比较规则。后缀表示该比较规则是否区分语言中的重音,大小写,具体如下:</p>
<table>
<thead>
<tr>
<th>后缀</th>
<th>英文释义</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>_ai</td>
<td>accent insensitive</td>
<td>不区分重音</td>
</tr>
<tr>
<td>_as</td>
<td>accent sensitive</td>
<td>区分重音</td>
</tr>
<tr>
<td>_ci</td>
<td>case insensitve</td>
<td>不区分大小写</td>
</tr>
<tr>
<td>_cs</td>
<td>case sensitive</td>
<td>区分大小写</td>
</tr>
<tr>
<td>_bin</td>
<td>binary</td>
<td>以二进制方式比较</td>
</tr>
</tbody>
</table>
<p>最后一列<code>Maxlen</code>,它代表该字符集表示一个字符最多需要几个字节。</p>
<table>
<thead>
<tr>
<th>字符集名称</th>
<th>Maxlen</th>
</tr>
</thead>
<tbody>
<tr>
<td>ascill</td>
<td>1</td>
</tr>
<tr>
<td>latin1</td>
<td>1</td>
</tr>
<tr>
<td>gb2312</td>
<td>2</td>
</tr>
<tr>
<td>gbk</td>
<td>2</td>
</tr>
<tr>
<td>utf8</td>
<td>3</td>
</tr>
<tr>
<td>utf8mb4</td>
<td>4</td>
</tr>
</tbody>
</table>
<pre><code class="language-sql">#查看gbk字符集的比较规则
SHOW COLLATION LIKE 'gbk%'
#查看utf8字符集的比较规则
SHOW COLLATION LIKE 'utf8%'
</code></pre><br><br>
来源:https://www.cnblogs.com/lisong0626/p/19416905
頁: [1]
查看完整版本: MySQL 5.7.x版本修改字符集(Win11环境)