教你解决往mysql数据库中存入汉字报错的方法
程序员文章站
2022-03-17 17:17:34
一、遇到的问题在向数据库中存入汉字时遇到这样的问题:cause: java.sql.sqlexception: incorrect string value: ‘\xe6\x9f\xaf\xe5\x8...
一、遇到的问题
在向数据库中存入汉字时遇到这样的问题:
cause: java.sql.sqlexception: incorrect string value: ‘\xe6\x9f\xaf\xe5\x8d\x97' for column ‘user_name' at row 1
二、分析问题
这是由于数据库设计有问题导致的,当初创建数据库的时候直接选择的默认,没有修改为utf-8,后来尝试手动修改还是不行。
尝试把数据库和表的默认字段改为utf8,但是还是不能存汉字。
三、真正的问题
真正的问题打开表的信息可以看到
latin1
的存在,这是因为即使我们后面手动修改字段类型还是修改不了的,就像上面即使我们修改了,可是表信息还是没有改掉,真正的解决办法:1、要不我们重新创建数据库,把创建的时候就设置成utf8(有点费劲),2、要不就是下面的解决办法(也不是那么轻松,如果涉及的字段比较多的话),导出并修改sql语句,然后在重新执行sql语句。
四、解决办法
把我们的数据库导出为sql文件:
/* sqlyog enterprise v12.08 (64 bit) mysql - 5.7.31 : database - data_test ********************************************************************* */ /*!40101 set names utf8 */; /*!40101 set sql_mode=''*/; /*!40014 set @old_unique_checks=@@unique_checks, unique_checks=0 */; /*!40014 set @old_foreign_key_checks=@@foreign_key_checks, foreign_key_checks=0 */; /*!40101 set @old_sql_mode=@@sql_mode, sql_mode='no_auto_value_on_zero' */; /*!40111 set @old_sql_notes=@@sql_notes, sql_notes=0 */; create database /*!32312 if not exists*/`data_test` /*!40100 default character set latin1*/; use `data_test`; /*table structure for table `user` */ drop table if exists `user`; create table `user` ( `user_id` int(11) not null auto_increment, `user_name` varchar(50) character set latin1 not null comment '账号', `password` varchar(50) character set latin1 not null comment '密码', `user_state` varchar(10) character set latin1 not null default '1' comment '状态,逻辑删除', primary key (`user_id`) ) engine=innodb auto_increment=13 default charset=latin1; /*data for the table `user` */ lock tables `user` write; insert into `user`(`user_id`,`user_name`,`password`,`user_state`) values (1,'keafmd','keafmd','1'),(3,'21312321','123','0'),(11,'213','213','1'),(12,'keafmd','666','0'); unlock tables; /*!40101 set sql_mode=@old_sql_mode */; /*!40014 set foreign_key_checks=@old_foreign_key_checks */; /*!40014 set unique_checks=@old_unique_checks */; /*!40111 set sql_notes=@old_sql_notes */;
就像上面说的一样我们发现了latin1的身影,那么我们就把
latin1
全部替换为utf8
。
替换后的sql文件:
/* sqlyog enterprise v12.08 (64 bit) mysql - 5.7.31 : database - data_test ********************************************************************* */ /*!40101 set names utf8 */; /*!40101 set sql_mode=''*/; /*!40014 set @old_unique_checks=@@unique_checks, unique_checks=0 */; /*!40014 set @old_foreign_key_checks=@@foreign_key_checks, foreign_key_checks=0 */; /*!40101 set @old_sql_mode=@@sql_mode, sql_mode='no_auto_value_on_zero' */; /*!40111 set @old_sql_notes=@@sql_notes, sql_notes=0 */; create database /*!32312 if not exists*/`data_test` /*!40100 default character set utf8 */; use `data_test`; /*table structure for table `user` */ drop table if exists `user`; create table `user` ( `user_id` int(11) not null auto_increment, `user_name` varchar(50) character set utf8 not null comment '账号', `password` varchar(50) character set utf8 not null comment '密码', `user_state` varchar(10) character set utf8 not null default '1' comment '状态,逻辑删除', primary key (`user_id`) ) engine=innodb auto_increment=13 default charset=utf8; /*data for the table `user` */ lock tables `user` write; insert into `user`(`user_id`,`user_name`,`password`,`user_state`) values (1,'keafmd','keafmd','1'),(3,'21312321','123','0'),(11,'213','213','1'),(12,'keafmd','666','0'); unlock tables; /*!40101 set sql_mode=@old_sql_mode */; /*!40014 set foreign_key_checks=@old_foreign_key_checks */; /*!40014 set unique_checks=@old_unique_checks */; /*!40111 set sql_notes=@old_sql_notes */;
选择执行sql脚本,选择修改后的sql文件
此时再查看表信息
这样就全部是utf8了,这样基本上可以肯定解决问题了。
五、解决效果
测试验证下是否真正的解决问题了:
到此这篇关于mysql基础之教你解决往数据库中存入汉字报错的方法的文章就介绍到这了,更多相关往数据库存入汉字报错的解决方法内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!