首页 > 开发 > MySQL > 正文

[Mysql] Select 不到,Insert出错的问题,字段编码问题

2017-09-08 09:11:14  来源:网友分享

Mysql 5.5 表结构为:

CREATE TABLE `account` (  `name` varchar(20) NOT NULL,  PRIMARY KEY (`name`)) ENGINE=InnoDB DEFAULT CHARSET=gbk;

name 字段目前的编码:

CharacterSet:gbkCollation:gbk_chinese_ci

目前我的程序逻辑为:

首先:

select * from `account` where `name`=?

如果返回空,则插入该name:

insert into `account` (`name`) values(?)

现在在我后台有几个报错记录:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '积分' for key 'PRIMARY'

(请忽略name为乱码,这可能是我输出记录文本导致的)

我的问题是,为什么我明明先select了该name,没有我才会insert,还会导致这个异常?

这是否跟我设置了name字段为gbk编码有关?有没相关参考文章可以提供给我看下?

应该将该字段编码设置为什么来避免这个问题?

BTW:使用ignore参数当然可以忽略该异常,但我主要想知道为什么之前select无法获取,Insert却出错

解决方案

字符编码问题请高人来解答。

我只说点别的。

在高并发的情况下,你这两次操作的结果是不确定的,是不安全的。

使用如下的原子操作更安全一些。

INSERT INTO `table` (`id`, `name`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`);

或者

INSERT IGNORE INTO `table` (`id`, `name`) VALUES (?, ?)