You need to escape the password to make it a valid URL. Something like this
will do:
my $uri = sprintf 'mysql://%s:%s@%s/%s', map { Mojo::Util::url_escape($_) }
$user, $pass, $host, $dbname;
On Thursday, July 16, 2015 at 5:54:25 PM UTC+2, Richard Sugg wrote:
>
> I ran into an issue where the database user has a # character, and
> Mojo::mysql doesn't parse the uri like I expected. If I set the dsn,
> username, and password separately, it works. Should I be escaping the # in
> some way? Here's an example:
>
> my $user = 'user';
> my $pass = 'abc#def';
> my $host = 'host.domain';
> my $dbname = 'db';
>
> my $mysql = Mojo::mysql->new;
> my $uri = sprintf('mysql://%s:%s@%s/%s', $user, $pass, $host, $dbname);
> my $parsed = $mysql->from_string($uri);
> print "Given URI: $uri\n";
> print "Parsed:\n";
> print " DSN: " . $mysql->dsn . "\n";
> print " User: " . $mysql->username . "\n";
> print " Pass: " . $mysql->password . "\n";
>
> $mysql->dsn("dbi:mysql:dbname=$dbname;host=$host");
> $mysql->username($user);
> $mysql->password($pass);
> print "Set manually:\n";
> print " DSN: " . $mysql->dsn . "\n";
> print " User: " . $mysql->username . "\n";
> print " Pass: " . $mysql->password . "\n";
>
> produces
>
> Use of uninitialized value in concatenation (.) or string at
> /Users/risugg/.plenv/versions/5.20.2/lib/perl5/site_perl/5.20.2/Mojo/
> mysql.pm line 57.
> Given URI: mysql://user:abc#[email protected]/db
> Parsed:
> * DSN: dbi:mysql:dbname=;host=user:abc*
> User:
> Pass:
> Set manually:
> * DSN: dbi:mysql:dbname=db;host=host.domain*
> User: user
> Pass: abc#def
>
--
You received this message because you are subscribed to the Google Groups
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.