как получилось, что тип данных MySQL бит php печатает юникод?


Когда мой тип данных MySQL бит(1), но при печати с помощью php json_encode будет писать в юникоде? Службы IIS работают нормально,
но на моем выделенном сервере хостинг Apache станет юникодом. почему? enter image description here

Вы можете увидеть Locating, Locating на Mysql тип данных битный, но напечатанный \u0001? почему?

Это мой метод получения кода get-googlemarker.php для получения этого результата

<?php
mysql_connect("localhost", "root", "123456") or die("Could not connect");
mysql_select_db("db_gps") or die("Could not select database");

$parent_id = $_GET['mainid'];

$query = "SELECT        *
FROM          tbl_locate AS a
INNER JOIN     
(
    SELECT    MainID, Max(DateTime) AS DateTime
    FROM      tbl_locate
    GROUP BY  MainID
) AS b
ON            a.MainID = b.MainID
AND           a.DateTime = b.DateTime
LEFT JOIN     
(
    SELECT b.PicData
     , b.PicUploadedDateTime
     , b.MainID
  FROM (SELECT    MainID,Max(PicUploadedDateTime) as PicUploadedDateTime
        FROM      tbl_picture
        group by MainID
       ) l
  JOIN tbl_picture b
    ON b.MainID = l.MainID AND b.PicUploadedDateTime = l.PicUploadedDateTime
) AS c
ON            a.MainID = c.MainID";

$rs = mysql_query($query);

$arr = array();
while($obj = mysql_fetch_object($rs)) {
 $arr[] = $obj;
}

echo json_encode($arr);


?>

ОБНОВЛЕНО

Данные представления верны, но проблема в том, что я использую ниже javascript я не могу прочитать значение определения местоположения, я пробовал alert запись, но она пуста. я пробовал определять местоположение с помощью type:string , type:bit , type:bytes , type:int ,
но не работает. не могу ничего показать в alert

Ext.define('GoogleMarkerModel', {
        extend: 'Ext.data.Model',
        fields: [
        {name: 'ID',    type: 'int'},
        {name: 'Locating',    type: 'int'},
        {name: 'MainPower',    type: 'int'},
        {name: 'Acc',    type: 'int'},
        {name: 'PowerOff',    type: 'int'},
        {name: 'Alarm',    type: 'int'},
        {name: 'Speed',    type: 'int'},
        {name: 'Direction',    type: 'int'},
        {name: 'Latitude',    type: 'float'},
        {name: 'Longitude',    type: 'float'},
        {name: 'DateTime',    type: 'datetime'},
        {name: 'MainID',    type: 'int'},
        {name: 'IOState',    type: 'int'},
        {name: 'OilState',    type: 'int'},
        {name: 'PicUploadedDateTime',    type: 'datetime'},
        {name: 'PicData',    type: 'str'}
        ]
    });
Author: DanFromGermany, 2013-08-02

2 answers

Представление переменной по-прежнему правильно.

Начиная с PHP 5.4, вы можете использовать опцию JSON_UNESCAPED_UNICODE с json_encode(). См. http://php.net/manual/en/function.json-encode.php

Я предполагаю, что ваш IIS по умолчанию возвращает неэкранированное значение.

В Javascript вы обычно используете parseInt(\u0001) или что-то в этом роде. Поскольку это extjs, я не знаю для этого.

План Б:

A) Измените столбец базы данных с битового на целое число.

Б) бросить значение базы данных в php

while($obj = mysql_fetch_object($rs)) {
  $obj->Locating = (int)$obj-Locating;
  // or try with (string) if (int) fails
  $arr[] = $obj;
}

C) просто str_replace в выводе json:

$json = json_encode($arr);
$json = str_replace('"\u0001"', '"1"', $json);
$json = str_replace('"\u0000"', '"0"', $json);
 1
Author: DanFromGermany, 2013-08-07 13:54:44

Используйте mysqlnd (собственный драйвер) для php. Если вы используете ubuntu:

sudo apt-get install php5-mysqlnd
sudo service apache2 restart

Собственный драйвер возвращает целочисленные типы соответствующим образом.

Этот метод будет работать только для PDO (не mysqli).

 0
Author: ashkufaraz, 2015-12-14 04:49:21