【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(20) NOT 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_name
FROM t_user;
你也可以使用 GROUP BY 来读取数据表中不重复的数据:
SELECT name, nickname
FROM t_user
GROUP BY (name, nickname);
删除重复数据
如果你想删除数据表中的重复数据,可以使用以下的SQL语句:
CREATE TABLE tmp
SELECT name, nickname, sex
FROM t_user
GROUP 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%"(注:百分之三十)时也会出现问题。
\