mysql无法插入中文数据

一、原因:一般是数据库、表、字段字符集不对

通过下面的步骤进一步定位

1. 查询数据库字符集

show create database testcharset
注:testcharset为本地数据库名

  • 执行结果
    在这里插入图片描述
  • 将Create Database的字段值copy出来
    CREATE DATABASE testcharset /*!40100 DEFAULT CHARACTER SET latin1 */
  • 结果尾部表明数据库字符集为latin1

2. 查询表字符集

show create table uc_stb_bind;
注:uc_stb_bind为本地无法插入中文的表名

  • 执行结果
    在这里插入图片描述
  • 将Create Table的字段值copy出来
    CREATE TABLE uc_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 DATABASE testcharset /*!40100 DEFAULT CHARACTER SET utf8 */
  • 尾部表明数据库的字符集已更改为 utf8

2. 修改表字符集

alter table uc_stb_bind default character set uft8

  • 通过执行前面1.2章节的查询表字符集命令查看结果:
    CREATE TABLE uc_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 TABLE uc_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 TABLE uc_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

原创文章 20 获赞 21 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lanxing_huangyao/article/details/85030489
今日推荐