vlambda博客
学习文章列表

【MySQL】处理重复数据和SQL 注入

点击上方“蓝字”关注我们
【MySQL】处理重复数据和SQL 注入

处理重复数据

有些MySQL数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。


防止表中出现重复数据


可以在MySQL数据表中设置指定的字段为 PRIMARYKEY(主键)或者 UNIQUE(唯一)索引来保证数据的唯一性。


实例:下表中无索引及主键,所以该表允许出现多条重复记录。

 
        
CREATE TABLE t_user( name CHAR(20),    nickname CHAR(20), sex CHAR(10) );

如果想设置表中字段name,nickname数据不能重复,你可以设置双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。如下所示:

 
        
CREATE TABLE t_user( name CHAR(20) NOT NULL, nickname CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );

如果设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。


INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。


以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:

INSERT IGNORE INTO t_user (name, nick_name)VALUES ('李四''四子');
INSERT IGNORE INTO t_user (last_name, first_name)VALUES ('张三', '三儿');

INSERT IGNORE INTO当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。而REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。


另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:

 
        
CREATE TABLE t_user( name CHAR(20) NOT NULL,   nickname CHAR(20NOT NULL, sex CHAR(10), UNIQUE (name, nickname));


统计重复数据


以下将统计表中 name 和nickname的重复记录数:

SELECT COUNT(*) as repetitions, name,  nickname    FROM t_user GROUP BY name, nickname HAVING repetitions > 1;
  
以上查询语句将返回t_user表中重复的记录数。一般情况下,查询重复的值,请执行以下操作:
  • 确定哪一列包含的值可能会重复。

  • 在列选择列表使用COUNT(*)列出的那些列。

  • 在GROUP BY子句中列出的列。

  • HAVING子句设置重复数大于1。



过滤重复数据


如果需要读取不重复的数据可以在SELECT语句中使用DISTINCT关键字来过滤重复数据。

 
        
SELECT DISTINCT name, nick_nameFROM t_user;

你也可以使用 GROUP BY 来读取数据表中不重复的数据:

SELECT name, nicknameFROM t_userGROUP BY (name, nickname);

删除重复数据


如果你想删除数据表中的重复数据,可以使用以下的SQL语句:

 
        
CREATE TABLE tmpSELECT name, nickname, sexFROM t_userGROUP BY (name, nickname, sex);
DROP TABLE user_tbl;
ALTER TABLE tmp RENAME TO user_tbl;

当然也可以在数据表中添加 INDEX(索引)和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

ALTER IGNORE TABLE t_user    ADD PRIMARY KEY (name, nickname);


SQL注入

如果通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。


所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。


永远不要信任用户的输入,必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。


防止SQL注入,需要注意以下几个要点:

  • 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。

  • 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

  • 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

  • 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

  • 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

  • sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。


Like语句中的注入


like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。

【MySQL】处理重复数据和SQL 注入


\