當你在插入數(shù)據(jù)或建表后發(fā)現(xiàn)注釋亂碼,你應該通過以下方式進行排查。
- 查看MySql編碼格式
show variables like '%char%';

全是latin1,可不就亂碼了,所以你應該通過以下方式進行修改
set character_set_client = 'utf8';
set character_set_connection = 'utf8';
set character_set_database = 'utf8';
set character_set_results = 'utf8';
set character_set_server = 'utf8';
執(zhí)行了這些命令后,在看下是不是都修改過來了

在插入數(shù)據(jù)之前,記得重啟下MySql服務,否則亂碼問題依舊。如果還未解決,繼續(xù)往下看。
- 查看表編碼格式
-- 數(shù)據(jù)庫是 test
show create database test;

修改表數(shù)據(jù)編碼格式
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
網(wǎng)上說修改后,命令行亂碼,我用的Navicat工具的命令行沒出現(xiàn)這個問題,如果有這個問題的話,可以在插入語句之前執(zhí)行,set names utf8;
- 查看數(shù)據(jù)庫編碼配置
mysql安裝目錄的默認配置文件my-default.ini,建議這個文件不要動另新建一個my.ini配置文件,mysql會將my-default.ini替換成my.ini,網(wǎng)上看許多博客配置了[client],這個在5.6之后就不需要再配置了,配了也不起作用,而且mysqld中只能使用character_set_serve,而不能使用default_character_set了。
[mysqld]
basedir = mysql安裝目錄
datadir = mysql安裝目錄/data
port = 3306
character_set_server = utf8 #設置服務器端編碼
default-storage-engine = InnoDB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 如何避免中文亂碼
除了上面數(shù)據(jù)庫方面的設置要統(tǒng)一之外,建表和連接都要統(tǒng)一。
-- 建表
CREATE TABLE `lovego_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL,
`age` int(11) DEFAULT NULL,
`create_date` datetime NOT NULL,
`is_active` bit(1) DEFAULT b'1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
-- 連接
在連接url后面加上?useUnicode=true&characterEncoding=utf8
5.注意要點
我的mysql版本是5.6.35,在命令行設置完編碼,將mysql服務重啟后,發(fā)現(xiàn)編碼又恢復,原因是客戶端工具的編碼問題。
我用的是Navicat Premium工具中的命令行,那你就要注意,工具連接mysql時用的編碼,因為mysql服務器優(yōu)先使用客戶端請求的字符編碼,如果客戶端沒有注明字符編碼,mysql就會使用默認的字符編碼。在工具-編輯連接-高級中可以設置編碼,強烈建議使用自動。