我遇到了一个非常奇怪的问题,在我的数据库中我将我的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 )
答案 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()
更可靠。如果可能的话,最好的方法是修复输入数据的来源,以避免首先产生这些数据。