Framework: unionAll give value of "DATE" column type as Hex value.

Created on 3 Jun 2017  Â·  3Comments  Â·  Source: laravel/framework

  • Laravel Version: 5.4.24
  • PHP Version: 7.0.18
  • Database Driver & Version: Mariadb Version 10.1.23

Description:

When accessing variable that is DATE type in database, the return value is in HEX (b"É\x07\x01\x0F"). But if I use union instead of unionAll, the return value is correct.
If I change the column type to DATETIME, the date value return as expected. So I think the bug is affect only DATE type.

Steps To Reproduce:

  1. create table users.
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `dob` date DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `users_email_unique` (`email`),
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  1. Create table friends
CREATE TABLE `friends` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sender_id` int(10) unsigned NOT NULL,
  `sender_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `recipient_id` int(10) unsigned NOT NULL,
  `recipient_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `friends_sender_id_sender_type_index` (`sender_id`,`sender_type`),
  KEY `friends_recipient_id_recipient_type_index` (`recipient_id`,`recipient_type`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  1. Run function getFriends.
$sender = Friendship::whereSenderId($this->id)
            ->join('users as u', 'u.id', '=', 'friends.sender_id')
            ->select(['u.*', 'friends.recipient_id as friend_id', 'friends.status']);
$recipient = Friendship::whereRecipientId($this->id)
            ->join('users as u', 'u.id', '=', 'friends.recipient_id')
            ->select(['u.*', 'friends.sender_id as friend_id', 'friends.status']);

return $sender->unionAll($recipient)->get();
  1. The return value is like this.
#attributes: array:15 [
        "id" => 4
        "name" => "Foo"
        "email" => "[email protected]"
        "password" => "$2y$10$RgHz/wKsqqKoD44oEErN1.Vea9awby6oTI.TJPY2K2GGB3FMTnjJK"
        "dob" => b"É\x07\x01\x0F"
        "created_at" => "2017-03-16 17:35:37"
        "updated_at" => "2017-05-13 19:57:07"
        "friend_id" => 5
        "status" => 0
      ]

Most helpful comment

Salut,

J'arrive 1 an plus tard mais j'ai eu le mĂȘme problĂšme et je n'ai pas trouvĂ© la solution sur Google ni sur divers forum donc je la met ici. Effectivement quand on fait un unionAll (juste l'unionAll, l'union simple ça passe), les champs mysql de type date sont castĂ©s sur un type soit disant natif de PHP NEWDATE et Ă  priori ce type c'est la date sous format HexadĂ©cimal.

Pour contourner ça, il faut passer l'option PDO::ATTR_EMULATE_PREPARES Ă  true dans le fichier de configuration des connexions Ă  la base de donnĂ©e (en faisant ça, le type date de mysql est bien castĂ© en string donc le format reste inchangĂ©). Perso j'avais pas envie de l'activer sur toutes les requĂȘtes donc j'ai juste créé une deuxiĂšme connexion avec ce paramĂštre que j'utilise seulement quand j'ai des unionAll ^^

Sinon on peut aussi se dire que l'unionAll n'est pas vital et qu'on pourrait splitter la requĂȘte et ensuite faire l'opĂ©ration d'union sur les collections rĂ©sultantes des deux requĂȘtes.

All 3 comments

Sorry but please ask on the forums, this doesn't look like a framework core issue.

Salut,

J'arrive 1 an plus tard mais j'ai eu le mĂȘme problĂšme et je n'ai pas trouvĂ© la solution sur Google ni sur divers forum donc je la met ici. Effectivement quand on fait un unionAll (juste l'unionAll, l'union simple ça passe), les champs mysql de type date sont castĂ©s sur un type soit disant natif de PHP NEWDATE et Ă  priori ce type c'est la date sous format HexadĂ©cimal.

Pour contourner ça, il faut passer l'option PDO::ATTR_EMULATE_PREPARES Ă  true dans le fichier de configuration des connexions Ă  la base de donnĂ©e (en faisant ça, le type date de mysql est bien castĂ© en string donc le format reste inchangĂ©). Perso j'avais pas envie de l'activer sur toutes les requĂȘtes donc j'ai juste créé une deuxiĂšme connexion avec ce paramĂštre que j'utilise seulement quand j'ai des unionAll ^^

Sinon on peut aussi se dire que l'unionAll n'est pas vital et qu'on pourrait splitter la requĂȘte et ensuite faire l'opĂ©ration d'union sur les collections rĂ©sultantes des deux requĂȘtes.

Salut,

J'arrive 1 an plus tard mais j'ai eu le mĂȘme problĂšme et je n'ai pas trouvĂ© la solution sur Google ni sur divers forum donc je la met ici. Effectivement quand on fait un unionAll (juste l'unionAll, l'union simple ça passe), les champs mysql de type date sont castĂ©s sur un type soit disant natif de PHP NEWDATE et Ă  priori ce type c'est la date sous format HexadĂ©cimal.

Pour contourner ça, il faut passer l'option PDO::ATTR_EMULATE_PREPARES Ă  true dans le fichier de configuration des connexions Ă  la base de donnĂ©e (en faisant ça, le type date de mysql est bien castĂ© en string donc le format reste inchangĂ©). Perso j'avais pas envie de l'activer sur toutes les requĂȘtes donc j'ai juste créé une deuxiĂšme connexion avec ce paramĂštre que j'utilise seulement quand j'ai des unionAll ^^

Sinon on peut aussi se dire que l'unionAll n'est pas vital et qu'on pourrait splitter la requĂȘte et ensuite faire l'opĂ©ration d'union sur les collections rĂ©sultantes des deux requĂȘtes.

Merci beaucoup.
Je viens d'avoir le problĂšme.
Ca ma rendue fou pendant 1h.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

gabriellimo picture gabriellimo  Â·  3Comments

Anahkiasen picture Anahkiasen  Â·  3Comments

klimentLambevski picture klimentLambevski  Â·  3Comments

JamborJan picture JamborJan  Â·  3Comments

progmars picture progmars  Â·  3Comments