mysql无法插入中文数据
- 一、原因:一般是数据库、表、字段字符集不对
- 1. 查询数据库字符集
- 2. 查询表字符集
- 二、修改字符集
- 1. 修改数据库字符集
- 2. 修改表字符集
- 3. 修改单个字段的字符集
- 4. 连同表、修改所有字段
一、原因:一般是数据库、表、字段字符集不对
通过下面的步骤进一步定位
1. 查询数据库字符集
show create database testcharset
注:testcharset为本地数据库名
- 执行结果
- 将Create Database的字段值copy出来
CREATE DATABASEtestcharset
/*!40100 DEFAULT CHARACTER SET latin1 */- 结果尾部表明数据库字符集为latin1
2. 查询表字符集
show create table uc_stb_bind;
注:uc_stb_bind为本地无法插入中文的表名
- 执行结果
- 将Create Table的字段值copy出来
CREATE TABLEuc_stb_bind
(bind_id
varchar(255) NOT NULL,adsl_name
varchar(255) DEFAULT NULL,app_id
varchar(255) DEFAULT NULL,bind_time
datetime DEFAULT NULL,display_name
varchar(255) DEFAULT NULL,stb_name
varchar(255) DEFAULT NULL,stb_no
varchar(255) DEFAULT NULL,update_time
datetime DEFAULT NULL,app_user_id
varchar(255) DEFAULT NULL,
PRIMARY KEY (bind_id
)
) ENGINE=InnoDB DEFAULT CHARSET=latin1- 结尾部分的lantin1说明表的字符集也是latin1
注:这里没有标出字段的字符集,说明全部与表字符集一致,都是latin1, 否则会显示字段本身的字符集
二、修改字符集
1. 修改数据库字符集
alter database testcharset default character set utf8
- 通过执行前面1.1章节的查询数据库字符集命令查看结果:
CREATE DATABASEtestcharset
/*!40100 DEFAULT CHARACTER SET utf8 */- 尾部表明数据库的字符集已更改为 utf8
2. 修改表字符集
alter table uc_stb_bind default character set uft8
- 通过执行前面1.2章节的查询表字符集命令查看结果:
CREATE TABLEuc_stb_bind
(bind_id
varchar(255) CHARACTER SET latin1 NOT NULL,adsl_name
varchar(255) CHARACTER SET latin1 DEFAULT NULL,app_id
varchar(255) CHARACTER SET latin1 DEFAULT NULL,bind_time
datetime DEFAULT NULL,display_name
varchar(255) DEFAULT NULL,stb_name
varchar(255) CHARACTER SET latin1 DEFAULT NULL,stb_no
varchar(255) CHARACTER SET latin1 DEFAULT NULL,update_time
datetime DEFAULT NULL,app_user_id
varchar(255) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (bind_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8- 尾部utf8说明表的字符集已经更改为utf8
注:可以看出,虽然表的字符集更改了,但字段的字符集仍然是lantin1, 所以更改表的字符集时字段字符集是不会改变的
3. 修改单个字段的字符集
alter table uc_stb_bind change display_name display_name varchar(255) character set utf8
注:上面的命令行中字段名需要写两次(不是手贱多打了一遍)
- 通过执行上面查询表字符集命令查看结果:
CREATE TABLEuc_stb_bind
(bind_id
varchar(255) CHARACTER SET latin1 NOT NULL,adsl_name
varchar(255) CHARACTER SET latin1 DEFAULT NULL,app_id
varchar(255) CHARACTER SET latin1 DEFAULT NULL,bind_time
datetime DEFAULT NULL,display_name
varchar(255) DEFAULT NULL,stb_name
varchar(255) CHARACTER SET latin1 DEFAULT NULL,stb_no
varchar(255) CHARACTER SET latin1 DEFAULT NULL,update_time
datetime DEFAULT NULL,app_user_id
varchar(255) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (bind_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8- 可以看到display_name字段的字符集已经与表的字段集一致了(都是uft8),因此未显示字段本身字符集, 而其它尚未更改字段的字符集仍然为latin1
注: 库、表、字段都修改完成后,该字段就可以插入中文数据的(我没有尝试只修改字段行不行,但只改表、库,不改字段是不行的
4. 连同表、修改所有字段
alter table uc_stb_bind convert to character set utf8
- 通过执行上面查询表字符集命令查看结果:
CREATE TABLEuc_stb_bind
(bind_id
varchar(255) NOT NULL,adsl_name
varchar(255) DEFAULT NULL,app_id
varchar(255) DEFAULT NULL,bind_time
datetime DEFAULT NULL,display_name
varchar(255) DEFAULT NULL,stb_name
varchar(255) DEFAULT NULL,stb_no
varchar(255) DEFAULT NULL,update_time
datetime DEFAULT NULL,app_user_id
varchar(255) DEFAULT NULL,
PRIMARY KEY (bind_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8- 可以看出所有字段的字符集没有额外标识出来,说明已经与表的字符集保持一致了,都是uft8
之前写的时候,感觉挺详细的,过了一个月回来一看,发现可执行度不高,因此做了一些调整
2019-1-29