mysql 中文亂碼問題分析
一、問題分析:
MySQL 中文亂碼通常是因為字符集設置不正確導致的。MySQL 有多種字符集,如 latin1、utf8、utf8mb4 等,如果在創建數據庫、數據表或者字段時沒有指定正確的字符集,或者在插入數據時使用了與數據庫字符集不一致的編碼,就可能出現亂碼。
二、解決方法:
1、確認當前 MySQL 的默認字符集。
在創建數據庫、數據表或字段時,明確指定字符集為 utf8(MySQL 5.5.3以前)或 utf8mb4(MySQL 5.5.3及以后,支持存儲4字節字符,如部分表情符號)。
例如:
# 創建數據庫:order_db, order_db_1, order_db_2, user_db 4個數據庫。CREATE DATABASE `order_db` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE DATABASE `order_db_1` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE DATABASE `order_db_2` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
CREATE DATABASE `user_db` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';# 在 數據庫 order_db_1 中,創建兩張表。USE `order_db_1`;# 創建 t_order_1 表DROP TABLE IF EXISTS `t_order_1`;CREATE TABLE `t_order_1` (
`order_id` BIGINT(20) NOT NULL COMMENT '訂單id',
`price` DECIMAL(10,2) NOT NULL COMMENT '訂單價格',
`user_id` BIGINT(20) NOT NULL COMMENT '下單用戶id',
`status` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '訂單狀態',
PRIMARY KEY(`order_id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;# 創建 t_order_2 表DROP TABLE IF EXISTS `t_order_2`;CREATE TABLE `t_order_2` (
`order_id` BIGINT(20) NOT NULL COMMENT '訂單id',
`price` DECIMAL(10,2) NOT NULL COMMENT '訂單價格',
`user_id` BIGINT(20) NOT NULL COMMENT '下單用戶id',
`status` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '訂單狀態',
PRIMARY KEY(`order_id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;# 在數據庫 user_db, order_db_1, order_db_2 三個數據庫中,創建公共表 t_dictUSE user_db;DROP TABLE IF EXISTS `t_dict`;CREATE TABLE `t_dict` (`dict_id` BIGINT(20) NOT NULL COMMENT '字典id',`type` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典類型',`code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典編碼',`value` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',PRIMARY KEY (`dict_id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci ROW_FORMAT=DYNAMIC;USE order_db_1;DROP TABLE IF EXISTS `t_dict`;CREATE TABLE `t_dict` (`dict_id` BIGINT(20) NOT NULL COMMENT '字典id',`type` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典類型',`code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典編碼',`value` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',PRIMARY KEY (`dict_id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci ROW_FORMAT=DYNAMIC;USE order_db_2;DROP TABLE IF EXISTS `t_dict`;CREATE TABLE `t_dict` (`dict_id` BIGINT(20) NOT NULL COMMENT '字典id',`type` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典類型',`code` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典編碼',`value` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',PRIMARY KEY (`dict_id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci ROW_FORMAT=DYNAMIC;# 在 user_db 數據庫中,創建 t_user 表:USE `user_db`;# 創建 t_user 表DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` (
`user_id` BIGINT(20) NOT NULL COMMENT '用戶id',
`fullname` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用戶姓名',
`user_type` CHAR(1) DEFAULT NULL COMMENT '用戶類型',
PRIMARY KEY(`user_id`) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
2、如果已經出現亂碼,可以通過以下 SQL 命令修改數據表或列的字符集:
# 查看字符編碼:
SHOW VARIABLES LIKE "char%";# 修改數據表或列的字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;# 例如:在 user_db 數據庫中,修改表 t_user
ALTER TABLE t_user CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE t_user CHANGE fullname fullname VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
3、確保在插入數據時使用的客戶端和連接字符串中指定了正確的字符集,例如在 MySQL 客戶端連接時使用SET NAMES ‘utf8mb4’。
如:在 idea 中設置字符集:
idea ---> File ---> Setting...
---> Editor
---> File Encodings
---> utf8
4、如果是從文件導入數據出現亂碼,確保文件的編碼格式正確,并且在導入時指定了正確的字符集。
5、檢查 MySQL 的配置文件 my.cnf(linux) 或 my.ini(windows),確保在 [mysqld] 部分設置了正確的字符集,例如:
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
6、修改配置后需要重啟 MySQL 服務。
net stop mysql80
net start mysql80
7、注意:在修改字符集時,需要確保數據庫中數據的兼容性,避免數據損壞。在做任何修改前,應該備份數據庫。
8、java 后臺代碼 設置 utf8 字符編碼亂碼問題
亂碼問題通常發生在字符編碼不一致時,導致字符顯示不正確。在 Java 后端設置 UTF-8 編碼主要涉及到以下幾個方面:
-
1)設置服務器接收請求和發送響應時使用UTF-8編碼。
-
2)設置數據庫連接和查詢使用 UTF-8 編碼。
-
3)設置應用服務器(如Tomcat)的默認編碼為 UTF-8。
8.1 在 Servlet 中設置請求和響應編碼:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
8.2 在數據庫連接中設置編碼:
String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8";
8.3 設置 Tomcat 默認編碼(在 server.xml 中):
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="UTF-8" />
<!-- 如果使用 Spring 框架,可以在配置文件中設置:--><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="properties"><props><prop key="fileEncoding">UTF-8</prop></props></property>
</bean>