3

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

+--------+
| 身份证 |
+--------+
| ABC94 |
| ABC94 |
+--------+

当我从 phpmyadmin 删除它们时,它会生成以下删除查询,您可以在其中看到一个 id 包含\r,这使得它是唯一的,但在选择视图中不可见。请让我知道如何确保何时保存 ID,然后它应该只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 )
4

1 回答 1

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()像我上面那样使用更可靠。如果可能的话,最好的方法是修复输入数据的来源,以避免一开始就生成这些数据。

于 2012-12-27T12:34:51.393 回答