IDS视觉上相同但实际上并非如此

时间:2012-12-27 12:27:24

标签: mysql

我遇到了一个非常奇怪的问题,在我的数据库中我将​​我的id设置为主键,它也存储了那些相同的ID,例如:

+--------+
|   ID   |
+--------+
|  ABC94 |
|  ABC94 |
+--------+

当我从phpmyadmin删除它们时,它会生成以下删除查询,您可以在其中看到一个包含\r的ID,这使其唯一但在选择视图中不可见。请告诉我如何确保ids何时被保存,然后只需ABC94部分并忽略\r or \d or the like之类的任何部分。谢谢,

DELETE FROM `Db` WHERE `ID` = 'ABC94\r';
DELETE FROM `DB` WHERE `ID` = 'ABC94';

我尝试使用以下代码,但由于\而导致错误,因为当我使用-代替\

时,它会正常工作
SELECT SUBSTRING_INDEX( "ABC94\r",  "\", 1 )

1 个答案:

答案 0 :(得分:2)

如果有任何额外空白的可能性,您必须在插入之前在应用程序代码中处理它,或者在插入时使用RDBMS将其修剪掉。

INSERT INTO `Db` (`ID`) VALUES (TRIM('input value'))

除非您设计了将白色替换为其他可打印字符的方案,否则无法在没有密钥违规的情况下更新现有行。

例如,将回车符替换为x,它们仍然是唯一的:

/* Global replacement of carriage returns with 'x' */
UPDATE `Db` SET `ID` = REPLACE(`ID`, '\r', 'x')

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_trim

您对SUBSTRING_INDEX()的尝试几乎有效,但您应该省略反斜杠,而是提供空字符串''

SELECT SUBSTRING_INDEX( 'ABC94\r',  '', 1 )

但是如上所述使用TRIM()更可靠。如果可能的话,最好的方法是修复输入数据的来源,以避免首先产生这些数据。