SQL查询的奇怪问题

时间:2011-02-02 16:37:30

标签: php mysql

我已将问题编辑为更具体和清晰

我在独立的PHP文件中有以下代码:

$conn = mysql_connect("localhost", "", "");

mysql_select_db("name", $conn);

$result = mysql_fetch_array(mysql_query("SELECT EVENT_PRIVATE FROM events WHERE EVENT_ID = 68")); 

var_dump($result);

结果为NULL

但是,如果我将完全相同的查询复制到phpMyAdmin,您可以看到EVENT_PRIVATE的值为1。

enter image description here

我只有一个数据库,所以我肯定使用相同的数据库,如果我选择不同的列,我可以看到正确的值。

我不懂,是吗?

4 个答案:

答案 0 :(得分:2)

我已经在PHP和MySQL的匹配版本上尝试了这一点,对于PHP“mysql”函数处理位字段的方式,或者至少我不理解的东西,它似乎有些奇怪。它看起来有点像一个bug。它像我在“mysqli”扩展中所期望的那样工作。这是我试过的:

<?php
// mysql: 
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db("test", $conn);
$result = mysql_fetch_array(mysql_query('SELECT EVENT_PRIVATE FROM test WHERE id = 2'));
var_dump($result);

/* Result: 
array(2) {
  [0]=>
  string(1) ""
  ["EVENT_PRIVATE"]=>
  string(1) ""
}
*/

// mysqli:
$mysqli = new mysqli('localhost', 'test', 'test', 'test');
$mysqli_result = $mysqli->query('SELECT EVENT_PRIVATE FROM test WHERE id = 2');
$result = $mysqli_result->fetch_array();
var_dump($result);

/* Result: 
array(2) {
  [0]=>
  string(1) "1"
  ["EVENT_PRIVATE"]=>
  string(1) "1"
}
*/
编辑:啊哈!

本书"High Performance SQL"说'MySQL将BIT视为字符串类型,而不是数字类型;当你检索BIT(1)值时,结果是一个字符串,但内容是二进制值0或1,而不是ASCII值“0”或“1”。

我期待BIT类似于SQL Server“位”数据类型,这是一个用于存储布尔值true / false(0/1)值的单个位。但是,在MySQL中它更像是一个位域 - 与SQL Server不同,你可以有一个位(8)字段,例如8位长。 MySQL有一个特定的“布尔”类型,而不是存储布尔值。

我猜这是正在发生的事情的根源。请注意,为mysql结果返回的是一个字符串(1) - 这是一个单字符长字符串,不是一个空字符串,它将是字符串(0)。如果你看一下这个单个字符的值:

echo ord($result['EVENT_PRIVATE']); 
1

...那么它是一个ASCII 1!

所以,我会说,奇怪的是,设计可能会发生什么。 mysql扩展在解释位域时非常直观,并且在位级别为您提供一个字符串,用于编码存储在MySQL字段中的实际位。或许,mysqli扩展更友好一些,并将值转换为位的字符串表示。

如果你使用mysql和mysqli抓住一点(8)设置为10101010,我会留给你试验会发生什么......

答案 1 :(得分:0)

尝试将查询范围缩小到单个event_id。在PHPMyAdmin上运行它,然后通过PHP运行它。您应该看到相同的值。

请注意,$final的分配与问题无关,因为它不会有缺陷。问题出在$results

答案 2 :(得分:-1)

将*替换为字段名称,以查看它是否抱怨EVENT_PRIVATE。也许它不应该是上限,或者你得到错误加入的结果。

答案 3 :(得分:-1)

请尝试这个:

$result = mysql_fetch_array(mysql_query("SELECT EVENT_PRIVATE FROM events WHERE EVENT_ID = '68'")); 

我只是在68左右添加单引号。让我知道它是否适合你。

编辑:

有关sql查询中单引号和双引号的更多信息,您可以查看THIS link