【问题标题】:MySQL: Identical Values Not IdenticalMySQL:相同的值不相同
【发布时间】:2017-03-15 20:14:44
【问题描述】:

我在这里阅读了一个类似的问题,但我不确定如何使它与 MySQL 相关。

我有一个数字文件,我要插入到表格中以进行记录。我正在读取文件,连接到我的数据库,并使用 PHP 查询数据库。该部门一切正常,这是我的代码:

$dbh = new PDO("mysql:host=$hostname; dbname=$database", $username, $password);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // <== add this line
print "Connected to Database\n\n\n";

$file = "missing.txt";
$fileArray = preg_split("/[\t\r]/", file_get_contents($file));

for ($i = 0; $i < count($fileArray); $i++) {
    if ($i == 0 || $i % 7 == 0) {
        $sql = $dbh->prepare("INSERT INTO temp_missing SET SKU = ?;");

        $sql->bindParam(1, $fileArray[$i]);

        $sql->execute();
        echo $fileArray[$i] . "</br>";
    }
}

现在看来,发送到 MySQL 的数据很好。第 1 行包含一个值 03999。我知道这个值存在于我们的另一个表中,所以我将键入一个 select 命令,以根据这个新表中存在的这些数字从一个表中获取特定信息。

SELECT num, name, description FROM table1 WHERE num IN (SELECT SKU FROM temp_missing);

这不会返回任何东西。不是一回事。如果我输入以下内容:

SELECT * FROM temp_missing WHERE SKU = 03999;
SELECT * FROM table1 WHERE num = 03999;
SELECT * FROM table1 WHERE num = '03999';

他们都会返回一些东西。它们都返回 num 或 SKU 为 03999 的行。但以下内容不返回任何内容:

SELECT * FROM temp_missing WHERE SKU = '03999';

这没有返回任何结果,而且我似乎在互联网上找不到任何东西(或者至少我无法正确表达我的问题)来弄清楚为什么它们不一样,以及如何使它们相同.

以下是这两个字段的设置方式:

table1

num -> VARCHAR -> 长度/设置:20 -> 没有无符号,不允许 Null,没有 Zerofill,默认留空,之后的所有内容都留空

temp_missing

SKU -> VARCHAR -> 长度/设置:50 -> 没有无符号,不允许 Null,没有 Zerofill,没有默认值,后面的所有内容都留空

我刚刚注意到的两个表之间有一个很大的区别(我没有创建这两个表,我在以前的程序员之后有所了解)。

num 是一个 KEY。 SKU 什么都不是。

这有什么不同吗??

请让我知道这是否有意义以及是否需要更多信息,如果碰巧有一个我找不到的问题 - 相信我,几个月来我一直在努力解决这个问题有不同的解决方法,但这次我找不到——我很抱歉。

谢谢。

作为附录,我正在读取的文件 -missing.txt- 是作为一个文本选项卡创建的,它与一个格式化为具有完全文本格式的行和列的 excel 文件分隔开来。以防万一。

【问题讨论】:

  • 03999.... PHP 中的前导零表示八进制数,但由于9s 是无效的八进制数,因此将转换为03 或十进制3。 ...这肯定会导致问题
  • 前导零不是问题,只要它被视为字符串 - 即'03999' 而不是03999。无论如何,数据库中的列是 varchar,所以这是一个字符串。
  • 难道select * from temp_missing 返回的值没有预先添加“0”,所以“3999”而不是“03999”?尝试使用bindValue 而不是bindParam,并使用第三个参数:$sql-&gt;bindValue(1, $fileArray[$i], PDO::PARAM_STR);。还要确保在任何时候都不要对 $fileArray 进行任何可能导致其值转换为数字而不是字符串的事情。
  • 在循环之前执行var_dump($fileArray),查看数组元素的数据类型。如果它不是字符串,那么就是你的问题。 preg_split 返回一个字符串数组,但也许您还有其他代码在该数组上工作?另外,您能确认select * from temp_missing 返回的内容吗?报告的 SKU 值中是否有预填充的零?
  • 改用这个正则表达式:/\s*[\t\n]\s*/:它将删除空格。请注意,您的字符串中有\n,因为您用\r 分割,但换行符中最常见的是\n,即使您有一个带有\r 的编码。

标签: php mysql


【解决方案1】:

不匹配的原因是您的正则表达式测试\r,而不是\n。由于您的文件可能有用于表示换行符的\r\n 序列,因此您最终会得到以\n 开头的字符串。如果您的行在制表符分隔符附近也有空格,那么这些也会出现在您的数据中。

为了解决这个问题,把你的正则表达式改成这样:

/\s*[\t\n]\s*/

\r 无需明确提及,\s 将涵盖它。仍然需要明确提及 \t\n,否则您还会被单个字段中出现的空格分隔。

或者,您还可以在拆分后删除值周围的空白,使用此映射:

$fileArray = array_map('trim', $fileArray);

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 2019-09-25
    • 2016-02-12
    • 2022-01-14
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多