一、实验环境
操作系统: CentOS7.5 Minimal
IP: 192.168.1.102
二、查看MySQL运行状态
# systemctl status mysqld.service
三、设置MySQL字符集
设置MySQL字符集为utf8
# cat /etc/systemd/system/mysqld.service
########################################################
[Unit]
Description=MySQL Server
After=network-online.target docker.service
Requires=docker.service
[Service]
ExecStartPre=-/usr/bin/docker rm -f mysql
ExecStart=/usr/bin/docker run \
--name mysql \
-p 192.168.1.102:3306:3306 \
-e UMASK=0600 \
-e UMASK_DIR=0700 \
-e MYSQL_HISTFILE=/dev/null \
-v /opt/mysqldata:/var/lib/mysql \
-v /opt/mysqlconfig/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf \
mysql:5.7.20
ExecStop=/usr/bin/docker stop mysql
LimitNOFILE=65535
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
########################################################
# cat /opt/mysqlconfig/mysqld.cnf | grep -Ev "^$|^#"
######################################################
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links = 0
max_connections = 2000
skip_name_resolve
character-set-client-handshake = FALSE
character-set-server = utf8
collation-server = utf8_general_ci
init_connect="SET NAMES 'utf8'"
[mysql]
default-character-set = utf8
[client]
default-character-set = utf8
######################################################
# systemctl restart mysqld
# mysql -u root -h 192.168.1.102 -p"MySQL@123" -e "show variables like 'character_set_%';"
设置MySQL字符集为utf8mb4
# cat /opt/mysqlconfig/mysqld.cnf | grep -Ev "^$|^#"
#####################################################
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links = 0
max_connections = 2000
skip_name_resolve
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect="SET NAMES 'utf8mb4'"
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
#####################################################
# systemctl restart mysqld
# mysql -u root -h 192.168.1.102 -p"MySQL@123" -e "SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';"
四、MySQL中的排序规则utf8_unicode_ci、utf8_general_ci的区别
MySQL中utf8_general_ci与utf8_unicode_ci有什么区别呢?
在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢?
ci是 case insensitive, 即 "大小写不敏感", x 和 X会在字符判断中会被当做一样的,bin 是二进制, x和 X会别区别对待。
例如你运行: SELECT * FROM table WHERE txt = 'x'
那么在utf8_bin中你就找不到 txt = 'X' 的那一行, 而 utf8_general_ci 则可以
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容
MySQL5.1中文手册中关于utf8_unicode_ci与utf8_general_ci的说明
如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束。
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了。
1、对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
2、utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
用一句话概况上面这段话:utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了!
五、参考
MySQL数据库字符集设置
https://www.jianshu.com/p/d9dc58f68822
MySQL 中 localhost 127.0.0.1 区别
https://jin-yang.github.io/post/mysql-localhost-vs-127.0.0.1-introduce.html
MySQL中utf8和utf8mb4区别
http://ourmysql.com/archives/1402
MySQL 5.7.20 编码由 utf8 改为 utf8mb4
https://www.lovesofttech.com/database/mysql5.7ToUtf8mb4
MySQL使用utf8mb4经验吐血总结
http://seanlook.com/2016/10/23/mysql-utf8mb4
全面了解MySQL中utf8和utf8mb4的区别
https://my.oschina.net/xsh1208/blog/1052781
MySQL utf8 vs utf8mb4 – What’s the difference between utf8 and utf8mb4?
https://www.eversql.com/mysql-utf8-vs-utf8mb4-whats-the-difference-between-utf8-and-utf8mb4