« 增加了feedsky的订阅 Apache防盗链的使用和破解 »

关于mysql判断字符串的诡异事件

一个用户在添加Discuz!的js调用的时候提示

SQL: INSERT INTO [Table]settings (variable, value) VALUES (’jswizard_threads_eME’, ‘….’)
Error: Duplicate entry ‘jswizard_threads_eME’ for key 1
Errno.: 1062

上面的数据库错误显示是提示settings已经有了jswizard_threads_eME这个数据,但实际上确实又没有这个数据,一直在排查是什么原因,然后发现了这个mysql诡异的现象

当settings表内存在jswizard_threads_Cp4时,
再插入jswizard_threads_eME会提示Duplicate entry,
也就是说下面2条sql第二条会报错的,
而数据库中确实没有jswizard_threads_eME这个内容。
后来再次测试发现公司的mysql版本为4.1.20有这种情况,mysql 5 无此情况
mysql代码:

  1. INSERT INTO cdb_settings( variable, value ) VALUES ('jswizard_threads_Cp4', '')
  2. INSERT INTO cdb_settings( variable, value ) VALUES ('jswizard_threads_eME', '')

总结下,估计mysql把jswizard_threads_eME和jswizard_threads_Cp4当成同一字符串了
本次诡异事件的主角mysql server version: 4.1.20-log

补记,随后发现更多不能插入的字符串,初步怀疑是settings表的索引坏了,但数据库修复,优化无效,在重建settings表之后问题解决。以后有用户无故(无故是指明明为空但是仍然提示Duplicate entry)数据表不能插入的情况,看来重建数据表也是一个解决方式

“关于mysql判断字符串的诡异事件”

8条回复
  1. 哈哈哈,我路过

  2. 河蟹的路过

  3. 偶也路过

  4. 这小孩不错

  5. 这个嘛`~~~

  6. 飘过

  7. 这个应该是你建的索引的问题。你上面的2个字符串的前17位是一样的,当你的索引:如char(16) 时,他就会有重复键的提示。

  8. To s7v7nislands:cdb_settings的索引字段是varchar(32) 应该不是你说的原因 还没找到为什么
    到目前位置再没出现过重复键的这个问题。

回复留言

*
To prove you're a person (not a spam script), type the security word shown in the picture.
Anti-Spam Image

你可以使用XHTML标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>