昨天一位同事问到一个问题,他的MySQL中导入数据的时候,发现唯一索引冲突,原因是有两行记录,区别只是有一条记录多了最后的一个空格。 希望有方法将他们设置不同。
复现:
CREATE TABLE `t` (
`c` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
insert into t(c) values("A");
insert into t(c) values("A ");
在执行第二个insert的时候,会报主键冲突。
原因:
gbk字符串判断时,用的是这个函数 my_strnncollsp_gbk (strings/ctype-gbk.c)
简单逻辑如下
size_t length= min(a_length, b_length);
int res= my_strnncoll_gbk_internal(&a, &b, length);
#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
diff_if_only_endspace_difference= 0;
#endif
if (!res && a_length != b_length)
{
if (diff_if_only_endspace_difference)
res= 1;
....
}
return res;
从代码上看,没有什么问题,逻辑是先用比较小的算出长度,然后作字符串对比,此时认为相同。然后根据宏定义,如果没有加编译参数VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE ,则diff_if_only_endspace_difference为0,因此当两个字符串只区别于末尾的空格个数时,认为字符串相同。
(不用担心'A' 和 'AB'对比的情况, 省略号部分作了这个判断的)
但是这个在5.0中新增的编译参数并没有用!!
原因是InnoDB在调用这个函数的时候,diff_if_only_endspace_difference传的就是0。
也就是说,你就算加了这个编译参数,行为并没有改变, 没有把这个值设置为1的代码 。
方案:
a) 比较优美的方案是是把InnoDB中调用处传入的diff_if_only_endspace_difference, 也改成按照VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE 来决定0还是1。
b) 比较简单的方案是将上面代码中的宏定义这段改写成意思相同的ifdef写法,
#ifdef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
diff_if_only_endspace_difference= 1;
#endif
分享到:
相关推荐
5. 错误处理和安全:良好的源码会包含错误处理机制,防止SQL注入等安全问题。例如,使用预处理语句可以有效避免此类攻击。 6. 模板引擎:高级的项目可能使用模板引擎(如Smarty)来分离视图和逻辑,使代码更易维护...
适用于:新手学习 简易系统开发 环境配置: phpstudy +hbulider (其他均可) 使用说明: 1,推荐使用集成环境软件phpstudy或者wampsever.xammp,操作方法都差不多 2,数据连接工具建议用PhpMyadmin。新手不建议使+A)...
本资源"PHP+Mysql 带SQL注入源码"似乎提供了一个用于学习和理解SQL注入问题的实例。下面将详细介绍这个主题。 首先,PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域,它与MySQL数据库结合,常用来构建...
3.6.2 使用asort()函数和ksort()函数对相关数组排序 3.6.3 反向排序 3.7 多维数组的排序 3.7.1 用户定义排序 3.7.2 反向用户排序 3.8 对数组进行重新排序 3.8.1 使用shuffle()函数 3.8.2 使用array_reverse()...
《通用数据底层 Jsa4j》是一套基于Java语言编写的源码库,它为开发者提供了在各种场景下处理数据的通用工具和方法。作为Java编程的经典案例,Jsa4j旨在简化数据操作,提高开发效率,使得在复杂的业务逻辑中处理数据...
抖音互关源码是一款基于E4A(Easy4App)编程语言开发的应用程序,主要用于实现抖音用户之间的关注互动。E4A是一种专为移动应用设计的简单易学的编程工具,它让开发者能够快速构建Android和iOS应用。这款源码包含...
2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从...
通过研究源码,开发者可以学习到SQL解析、查询优化、事务处理、存储引擎等核心模块的工作方式。例如,`sql`目录包含了SQL解析器和优化器的代码,而`storage`目录则包含了各种存储引擎,如InnoDB和MyISAM。 安装与...
在IT行业中,PHP和MySQL是两个非常...这个"PHP基础&MySQL学习源码.zip"文件可能包含了一些示例代码和练习,可以帮助你深入理解这两门技术。记得解压文件"Kwan1117"并探索其中的内容,动手实践是提升技能的最佳方式。
【标题】"基于PHP的Amysql(AMS)php管理系统源码.zip" 提供的是一个使用PHP编程语言构建的数据库管理系统的源代码。Amysql(AMS)可能是开发者自定义的一个MySQL管理工具,它允许用户通过Web界面来操作和管理MySQL...
1、基于servlet+jsp+mysql的简易网上书店项目源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...
【PHP实例开发源码—Amysql PHP (AMP)】是一个基于PHP编程语言的数据库操作示例,它利用了AMP(Apache、MySQL和PHP)这一经典的Web开发环境。这个压缩包包含了一个或多个PHP源代码文件,用于演示如何连接、查询、...
【描述】"商业版E4A原生态影视APP前端+后端源码, vip影视源码,前端+后端,内附文字教程!"表明这是一个用于商业运营的影视APP,具备VIP服务功能。源码的提供意味着开发者或购买者可以深入理解其工作原理,进行定制...
+ 关于课堂加分,课堂上回答问题,或者课堂实践时表现优秀,可加分,具体内容包含:姓名,学号,日期,成绩 + 关于课程实践评分,具体内容含:评分标准(最多250字),学号,姓名,成绩,点评。课程实践成绩可以...
以下是一些关键知识点,可以从提供的压缩包文件中的源码学习: 1. 数据库和表的创建:在`listing01-03.sql`中,你可能能找到如何使用`CREATE DATABASE`和`CREATE TABLE`语句来创建新的数据库和表的实例。这包括定义...
而"fxymxx18.zip"是包含实际源代码的压缩文件,解压后应能查看到项目的目录结构和具体代码,便于学习和研究。 这个CRM培训项目是一个很好的实践平台,可以加深对Java编程、Web开发和CRM系统的理解。通过实际操作,...
【标题】"PHP实例开发源码—Amysql(AMS) php管理系统.zip" 是一个包含PHP源代码的压缩包,主要用于实现基于PHP的数据库管理系统的开发。这个系统可能用于简化数据库的交互,提供友好的用户界面,以及进行数据的查询...
在这个名为“大数据实训项目源码:电影推荐系统.zip”的压缩包中,我们主要探讨的是一个基于大数据技术构建的电影推荐系统。这个系统的核心目标是利用海量的用户行为数据,为用户提供个性化的电影推荐,提高用户体验...