在向数据库中存入汉字时遇到这样的问题:
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了,这样基本上可以肯定解决问题了。
测试验证下是否真正的解决问题了:
OK,到此完美解决了学妹的问题,如果对你也有帮助那就太好了。
以上就是学妹跑过来问我往数据库中存入汉字为啥报错【手把手讲解】的全部内容。
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]
加油!
共同努力!
Keafmd