However, DBI->connect("DBD:MariaDB:database=xxx", $user, $pass); connects without problem.
[...]
So I guess that DBI->connect("DBD:MariaDB:database=... is using some form of default driver.
It works only by accident, or because DBI is quite relaxed regarding the data source argument to connect(). The DBI documentation clearly states:
connect
$dbh = DBI->connect($data_source, $username, $password)
or die $DBI::errstr;
$dbh = DBI->connect($data_source, $username, $password, \%attr)
or die $DBI::errstr;
[...]
The $data_source value must begin with "dbi:driver_name:". The driver_name specifies the driver that will be used to make the connection. (Letter case is significant.)
[...]
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] [d/l] [select] |
I think this is the important part of the documentation
As a convenience, if the $data_source parameter is undefined or empty, the DBI will substitute the value of the environment variable DBI_DSN. If just the driver_name part is empty (i.e., the $data_source prefix is "dbi::"), the environment variable DBI_DRIVER is used. If neither variable is set, then connect dies.
The first sentence does not apply, because $data_source is neither undefined nor empty. The second sentence does not apply, because $data_source does not start with "dbi::". The third sentence does not apply, because neither the first nor the second sentence applied.
I guess that the environment variable DBI_DRIVER is set to mysql as that is the RDBMS installed on the server.
Guess? How about printing the environment instead of guessing? Run env or perl -e 'print "$_=$ENV{$_}\n" for keys %ENV' from a shell for a list of all environment variables; perl -e 'print "$_=$ENV{$_}\n" for sort grep /^DBI_/,keys %ENV' to just list those starting with DBI_. From a CGI context, run something like this:
#!/bin/bash
echo -en "Content-Type: text/plain\r\n\r\n"
env
Or this:
#!/usr/bin/perl -T
use strict;
use warnings;
use Data::Dumper;
print
"Content-Type: text/plain\r\n\r\n",
Data::Dumper->new([\%ENV],['*ENV'])->Sortkeys(1)->Useqq(1)->Du
+mp();
Why should installing MySQL set a DBI-specific environment variable? MySQL does not do so out of the box, and I would be rather surprised if any of the major Linux or *BSD distributions would do so. It does not make any sense, simply because you may have more than one database on your system.
According to your logic, installing the SQLite library should automatically set $ENV{'DBI_DRIVER'}='SQLite', system-wide. Installing PostgreSQL should set it to 'Pg'. Installing MariaDB should set it to 'MariaDB'. Which one wins if I install PostgreSQL for the main work and SQLite to read some application database like, for example, Firefox bookmarks? The database installed first? The database installed last? Given that DBD::MariaDB does not only support MariaDB, but also MySQL, and it fixes a lot of problems of DBD::mysql, why should installing MySQL set $ENV{'DBI_DRIVER'}='mysql' instead of $ENV{'DBI_DRIVER'}='MariaDB'?
Let's assume your idea was real. Installing MySQL sets $ENV{'DBI_DRIVER'}='mysql'. Assume a very bare system, just enough to get MySQL running, plus Perl and DBI. Perl scripts would rely on $ENV{'DBI_DRIVER'}. Now, SQLite is installed as a dependency to support Firefox or any other application using SQLite database files. Following the same logic, installing SQLite forcefully sets $ENV{'DBI_DRIVER'}='SQLite'. Now all existing perl scripts would break just because you installed some completely independent software that has nothing to do with MySQL, or Perl, or DBI. It just installed another relational database. Wouldn't that be great? Imgine the hordes of users assembling in front of the home of whoever came up with that great idea, to celebrate it with torches, pitchforks, and some barrels containing tar and feathers.
Update:
You seem to trigger a bug in DBI->connect(), see Re^8: DBI placeholders for spatial data.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] [d/l] [select] |
$ cpan -D DBD::MariaDB
DBD::MariaDB
----------------------------------------------------------------------
+---
(no description)
P/PA/PALI/DBD-MariaDB-1.21.tar.gz
/Users/1nickt/.perlbrew/libs/perl-5.32.1@meta/lib/perl5/darwin-2le
+vel/DBD/MariaDB.pm
Installed: 1.21
CPAN: 1.21 up to date
Pali (PALI)
pali@cpan.org
$ perl -MDBD::MariaDB -E 'say $DBD::MariaDB::VERSION'
1.21
The way forward always starts with a minimal test.
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] [d/l] [select] |