Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

unionAll give value of "DATE" column type as Hex value. #19467

Closed
jeffersonsetiawan opened this issue Jun 3, 2017 · 3 comments
Closed

unionAll give value of "DATE" column type as Hex value. #19467

jeffersonsetiawan opened this issue Jun 3, 2017 · 3 comments

Comments

@jeffersonsetiawan
Copy link
Contributor

  • 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" => "foo@bar.com"
        "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
      ]
@themsaid
Copy link
Member

themsaid commented Jun 5, 2017

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

@themsaid themsaid closed this as completed Jun 5, 2017
@nicolasmilville
Copy link

nicolasmilville commented Nov 21, 2018

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.

@Sicklou
Copy link
Contributor

Sicklou commented Feb 6, 2020

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants