目錄
4.1 ALTER TABLE `tbl` DEFAULT CHARACTER SET utf8 ; 字段編碼格式未生效
4.2 對錶DDL時,會鎖表 -- (pt-online-schema-change)
1. 問題 - MySQL插入表情包符號
剛上mysql,經常發生前段傳過來的內容入庫發生異常,數據庫報:
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x8C\xB8’ for column ‘mechant_name’ at row 1
發現,數據庫建表時候,用的是utf8字符集,傳進來了表情包,表情包是4個字節的;
通常情況,Mysql數據編碼格式爲“utf-8”,對於漢字來說足夠;Mysql中utf8佔3個字節,但是,3個字節對於表情符號是不夠的,需4個字節;此時使用utf8,會出現‘\xF0\x9F\x8D\x83\xF0\x9F’的問題。
2、解決方法
utf8mb4編碼是utf8編碼的超集,兼容utf8,並且能存儲4字節的表情字符。
2.1針對字段修改編碼格式(推薦使用)
數據庫表對應字段上修改編碼格式爲utf8mb4,命令示例如下:
ALTER TABLE insure_user CHANGE nickname nickname VARCHAR(64) CHARACTER SET utf8mb4 ;
2. 2、整個數據庫修改編碼格式
修改數據庫表的編碼格式,修改爲utf8mb4;修改Mysql配置文件my.cnf(windows下爲my.ini),然後重啓數據庫
3. MySQL字符集
3.1 數據庫字符集
3.1.1查看當前數據庫字符集配置:
show variables like 'character%'
3.1.2 修改數據庫編碼格式
alter database databasename character set utf8
或者,直接修改mysql的配置文件 my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4
3.2 表的編碼
3.2.1 參看表的編碼格式
show create table table_name
可以輸出完整的建表語句,看其中的 “DEFAULT CHARACTER”項;
3.2.2修改表的編碼格式
alter table tablename character set utf8
3.3 字段的編碼
3.3.1 看字段編碼格式
show full columns from tableName
看 Collation列;
3.3.2 修改字段的編碼格式
alter table tablename modify fieldname varchar(50) character set utf8
4. 可能的問題
4.1 ALTER TABLE `tbl` DEFAULT CHARACTER SET utf8 ; 字段編碼格式未生效
雖然使用 ALTER TABLE `tbl` default character set utf8, 將表的編碼格式修改成了utf8; 但是 字段的編碼格式並沒有修改過來;
修改字段的編碼格式:
ALTER TABLE `tablename` CHANGE `字段名1` `字段名2` VARCHAR(36) CHARACTER SET utf8 NOT NULL;
將現有數據,轉換成新的編碼格式:
alter table `tablename` convert to character set utf8;
4.2 對錶DDL時,會鎖表 -- (pt-online-schema-change)
MySQL進行DDL操作時(修改字段類型、長度、編碼等等,都屬於DDL操作),MySQL會鎖表;
如果數據量小的表,沒有什麼影響;如果數據量大(1w條記錄以上?),就會對當前表的操作產生明顯的影響;尤其是千萬級,上億的表,影響更大;
看介紹,使用 pt-online-schema-change 在線DDL工具,可以減少影響(只是減少影響,而不是完全避免影響);
pt-oneline-schema-change 自己沒使用過,搞個鏈接過來吧,寫着挺清晰的
https://www.cnblogs.com/allenhu320/p/11358652.html