mysql存数据出现乱码、问号的问题

本文详细介绍了如何通过修改MySQL配置文件my.ini来解决数据库中的乱码问题,包括设置正确的字符集和校对规则。

注:我的MYSQL版本为5.6.25 


1、快捷键win+r,然后输入cmd进入dos命令窗口,然后输入mysql进入mysql的控制台,然后输入 show variables like 'character_set_%';

2、如果出现如下画面(这是我的,可能你的不一样),那说明你的MYSQL编码有问题。


3、这就需要你去改你mysql安装目录下的my.ini文件,具体路径在mysql的当前目录下。如果还没有,那么下边肯定还会有一个my-default.ini这样的文件,把中间的去掉,文件名改成my.ini  。

4、在你的my.ini加入下边的语句。如果你原来有了,直接修改;没有的话直接加上去。


[mysqld]
default-storage-engine=INNODB  
character-set-server=utf8  
collation-server=utf8_general_ci   
[client]
default-character-set=utf8
 
[client]  
default-character-set=utf8   
 
[mysqld]  


5、保存,然后再开一个dos,重启当前mysql(net stop mysql       net start mysql)。然后再重新进入mysql的命令行界面,输入show variables like 'character_set_%';  出现如下画面说明你的mysql编码修改成功。


6、访问你自己的程序,可以看到汉字可以正常显示、存储了!


这是楼主解决乱码的过程,跟大家分享,希望对你们有用。如要转载,请注明出处!


为者常成,行者常至;行者无疆;不有行者,无以图将来;

感谢李哥在程序中一直帮我!

<think>我们之前讨论的是MySQL分组取排序第二的数据,现在用户的新问题是关于MySQL读取数据出现乱码的解决方法。这属于字符集编码问题。 需要从以下几个方面考虑: 1. 数据库、表、字段的字符集设置 2. 连接字符集设置 3. 客户端字符集设置 常见的乱码原因包括: - 数据库存储的字符集与连接字符集不一致 - 应用程序处理字符编码的方式不正确 解决步骤: 1. 确认数据库、表、字段的字符集 2. 确认连接字符集(如SET NAMES) 3. 确认应用程序的字符编码处理 具体方法如下: </think>### MySQL数据出现乱码的解决方法指南 MySQL乱码问题本质是字符集配置不一致导致的编码转换错误。以下是系统性的排查流程和解决方案: --- ### 一、诊断乱码根源(四层检查) 1. **客户端编码检查** ```sql SHOW VARIABLES LIKE 'character_set_%'; ``` 关键变量: - `character_set_client` ▸ 客户端发送的编码 - `character_set_connection` ▸ 连接层编码 - `character_set_database` ▸ 数据库默认编码 - `character_set_results` ▸ 返回结果的编码 2. **表结构编码验证** ```sql SHOW CREATE TABLE your_table; -- 查看表字段字符集 ``` 3. **连接会话校验** ```sql STATUS; -- 查看当前连接编码信息 ``` 4. **物理存储验证** ```bash hexdump -C your_data_row.bin # 检查二进制实际存储内容 ``` --- ### 二、强制统一字符集方案 #### 方案1:全局配置(需重启MySQL) 修`my.cnf`文件: ```ini [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` #### 方案2:会话级修正(即时生效) 连接数据库后立即执行: ```sql SET NAMES 'utf8mb4'; -- 统一客户端/连接/结果集编码 SET CHARACTER SET utf8mb4; ``` #### 方案3:转换已有数据 ```sql ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` --- ### 三、不同场景修复方法 #### 案例1:中文显示为问号(???) **成因**:客户端不支持存储编码(如latin1中文) **修复**: ```sql -- 建立中转临时表 CREATE TABLE tmp_table AS SELECT CONVERT(column_name USING utf8mb4) AS fixed_data FROM your_table; -- 替换原数据 RENAME TABLE your_table TO backup_table, tmp_table TO your_table; ``` #### 案例2:显示为乱码方块(�) **成因**:UTF-8数据被误认为其他编码(如GBK) **修复**(Python示例): ```python import mysql.connector conn = mysql.connector.connect( charset='utf8mb4', # 明确指定编码 connection_timeout=10 ) cursor = conn.cursor() cursor.execute("SET NAMES utf8mb4") # 双重保险 ``` #### 案例3:特殊字符崩溃(如Emoji🚀) **根源**:UTF8不支持4字节字符 **方案**:必须升级到`utf8mb4`: ```sql ALTER DATABASE your_db CHARACTER SET = utf8mb4; ALTER TABLE your_table CHARACTER SET = utf8mb4; ``` --- ### 四、开发最佳实践 1. **统一编码原则** - 全系统强制使用`utf8mb4` - 禁止混合使用不同字符集 2. **连接规范** ```python # Python连接示例 db = pymysql.connect( host="localhost", charset="utf8mb4", # 关键参数 use_unicode=True ) ``` 3. **数据验证工具** ```sql SELECT column_name, HEX(column_name) AS hex_value -- 验证实际存储编码 FROM your_table WHERE id = 123; ``` --- ### 五、深度排查工具 1. **编码检测命令** ```bash file -i your_exported.csv # 检查文件编码 iconv -f original_charset -t utf8mb4 input.txt > output.txt ``` 2. **乱码修复工作流** ```mermaid graph LR A[乱码数据] --> B{存储编码检测} B -->|Latin1| C[CONVERT USING utf8mb4] B -->|GBK| D[iconv转换] C/D --> E[重新导入] E --> F[客户端SET NAMES验证] ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值