开发者社区> 问答> 正文

mysql中Select 不到,Insert出错的问题,字段编码问题

Mysql 5.5 表结构为:
screenshot
name 字段目前的编码:

`CharacterSet:gbk
Collation:gbk_chinese_ci`

目前我的程序逻辑为:

首先:

select * from account where name=?

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

insert into account (name) values(?)

现在在我后台有几个报错记录:
screenshot
(请忽略name为乱码,这可能是我输出记录文本导致的)

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

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

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

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

展开
收起
落地花开啦 2016-06-14 17:56:23 2646 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    个人认为这应该不是编码问题, 而是象 @HJin.me 所说, 是一个并发问题. 即session1 在select 得到empty set后; session2 去insert了一个相同的name; 此时session1去 insert, 则得到 duplicated.

    mysql事务默认的隔离级别是repeated read, 不会防止上面的情况, 实验一把.

    session1:  start transaction;
    session2:  start transaction;
    session1:  select * from account where name='11'; //empty set
    session2:  insert into account values('11');
    session2:  commit;
    session1:  insert into account values('11'); // duplicate key
    2019-07-17 19:38:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像