问题的根源
主要问题就是在字符集,一般解决这种问题都是靠试验。我实验了一通,得出的结论和大家分享一下(如有错误,还望指正):
- 数据库的字符集
- 数据库连接的字符集
配置方法
设置数据库的字符集为
utf8mb4
:创建数据库时(注意:是数据库),指定字符集(charset)和对比算法(collate)CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
,后面再说 collate干嘛的。-
设置数据库连接的字符集为
utf8mb4
:在建立 mysql 数据库连接时,指定字符集(charset),下面用 pyton 的 pymsql 连接数据库姿势举例:import pymysql params = {
'host': '127.0.0.1',
'port': 3306,
'db': 'xueweihan',
'user': 'root',
'password': '',
'charset': 'utf8mb4'} # set charset connection = pymysql.connect(**params)
不同字符集,对比方式(collate)也不一样,所以需要指定对比的规则,utf8mb4_unicode_ci
就是utf8mb4
字符集对应的对比规则。比方说字符集为utf8mb4
数据库,执行 sql 语句: select * from boy where name='xueweihan'
,就需要用指定的collate规则,来过滤数据库中的纪录。
使用姿势
创建数据库:CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
连接数据库:
import pymysql
params = {
'host': '127.0.0.1',
'port': 3306,
'db': 'xueweihan',
'user': 'root',
'password': '',
'charset': 'utf8mb4'} # set charset
connection = pymysql.connect(**params)