前言:有一個mysql數據庫,由於建庫的時候未使用utf8mb4的字符集,導致插入生僻字亂碼和報錯,經歷了2天的查詢和測試總結了以下經驗供參考。mysql 可以設置數據庫級別,表級別,列級別 字符集編碼;優先級順序為:數據庫字符集 < 表字符集 < 列字符集;字符集不一致時,以 更小范圍的配置為准。
1、建庫要規范:首先要明白你的用途,生產一定要提前設置標准,如果是中文建議使用utf8mb4,至於utf8和utf8mb4的區別,簡單來說是utf8mb4是4個字節是utf8的超集,可以兼容utf8,可以存特殊字符和表情。
①創建數據庫
CREATE DATABASE testmb4 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
注意“testmb4”是你設置的庫名
②創建表
CREATE TABLE testtable(id varchar(40) NOT NULL default '',userId varchar(40) NOT NULL default '') ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意“testtable”是你設置的表名,庫和表的字符集設置好了,基本就不會出問題。
2、如果數據庫、表已經創建可以直接修改數據庫或表的編碼格式,但是生產環境要慎重!!!
①修改數據庫的編碼格式
alter database <數據庫名> character set utf8mb4;
②修改數據表格編碼格式,風險:鎖全表
alter table <表名> character set utf8mb4; 只對表的屬性做變更,不對列上的字符集做轉換
alter table <表名> convert to character set utf8mb4; 對列上的字符集也做轉換
③修改字段編碼格式
alter table <表名> change <字段名> <字段名> <類型> character set utf8mb4;
3、mysql字符集常用命令
①查看MYSQL數據庫服務器和數據庫字符集
show variables like '%character%';
show variables like 'collation%';
②查看MYSQL所支持的字符集
show charset;
③查看數據表的編碼
show create table <表名>;
④查看字段的編碼
show full columns from <表名>;
⑤查看數據庫編碼:
SHOW CREATE DATABASE db_name;
4、字符集utf8和utf8mb4的報錯現象
①Mysql錯誤1366的解決辦法:Incorrect string value: '\xF0\x9F...' for column 'XXX' at row 1原因是UTF-8編碼有可能是兩個、三個、四個字節,Emoji表情或者某些特殊字符是4個字節,而Mysql的utf8編碼最多3個字節,所以數據插不進去。
解決方案:
第一種就是urlencode后存入數據庫 讀取的時候再urldecode
第二種數據庫字段改成utf8mb4,注意數據庫的連接方式也要改成utf8mb4
5、數據庫常用命令
①show databases;查看所有的數據庫,等同於select schema_name from information_schema.schemata\G。\G 替換;,以縱向報表的形式輸出結果,有利於閱讀。
②status 查看mysql數據庫的運行狀態
③use 命令選擇數據庫 例如 use information_schema,當使用此命令后select schema_name from information_schema.schemata\G,可以為select schema_name from schemata\G
④查看數據庫中的表
show tables 同樣也可以在information_schema中查看,show命令是方便使用的簡短模式。
select table_name from tables where table_schema='jblog';
⑤查看表結構
desc table_name;
⑥查看表狀態
show table status from db like 條件
可以查看engine數據庫引擎,version,row、index等信息
⑦小技巧,當多行命令輸入,發現錯誤后,用\c結束。
⑧查詢數據庫連接
show full processlist;
show status like '%Max_used_connections%';
show status like '%Threads_connected%';#當前連接數
show status like '%table_lock%';#表鎖定
show status like 'innodb_row_lock%';#行鎖定
show status like '%qcache%'; #查詢緩存情況
show variables like "%query_cache%";
SHOW STATUS LIKE 'Qcache%';
show variables like "%binlog%";
show status like 'Aborted_clients';#由於客戶沒有正確關閉連接已經死掉,已經放棄的連接數量
show variables like '%max_connections%';//查看最大連接數量
show variables like '%timeout%';#查看超時時間
show variables like 'log_%'; #查看日志是否啟動
