=encoding utf8 =head1 NAME DBD::MariaDB - MariaDB and MySQL driver for the Perl5 Database Interface (DBI) =head1 SYNOPSIS use DBI; my $dsn = "DBI:MariaDB:database=$database;host=$hostname;port=$port"; my $dbh = DBI->connect($dsn, $user, $password); my $sth = $dbh->prepare( 'SELECT id, first_name, last_name FROM authors WHERE last_name = ?' ) or die 'prepare statement failed: ' . $dbh->errstr(); $sth->execute('Eggers') or die 'execution failed: ' . $dbh->errstr(); print $sth->rows() . " rows found.\n"; while (my $ref = $sth->fetchrow_hashref()) { print "Found a row: id = $ref->{'id'}, fn = $ref->{'first_name'}\n"; } =head1 EXAMPLE #!/usr/bin/perl use strict; use warnings; use DBI; # Connect to the database. my $dbh = DBI->connect('DBI:MariaDB:database=test;host=localhost', 'joe', q(joe's password), { RaiseError => 1, PrintError => 0 }); # Drop table 'foo'. This may fail, if 'foo' doesn't exist # Thus we put an eval around it. eval { $dbh->do('DROP TABLE foo'); } or do { print 'Dropping foo failed: ' . $dbh->errstr() . "\n"; }; # Create a new table 'foo'. This must not fail, thus we don't # catch errors. $dbh->do('CREATE TABLE foo (id INTEGER, name VARCHAR(20))'); # INSERT some data into 'foo' using placeholders $dbh->do('INSERT INTO foo VALUES (?, ?)', undef, 2, 'Jochen'); # now retrieve data from the table. my $sth = $dbh->prepare('SELECT * FROM foo'); $sth->execute(); while (my $ref = $sth->fetchrow_hashref()) { print "Found a row: id = $ref->{'id'}, name = $ref->{'name'}\n"; } # Disconnect from the database. $dbh->disconnect(); =head1 DESCRIPTION B is the Perl5 Database Interface driver for MariaDB and MySQL databases. In other words: DBD::MariaDB is an interface between the Perl programming language and the MariaDB/MySQL programming API that comes with the MariaDB/MySQL relational database management system. Most functions provided by this programming API are supported. Some rarely used functions are missing, mainly because no-one ever requested them. :-) In what follows we first discuss the use of DBD::MariaDB, because this is what you will need the most. For installation, see the separate document L. See L for a simple example above. From perl you activate the interface with the statement use DBI; After that you can connect to multiple MariaDB and MySQL database servers and send multiple queries to any of them via a simple object oriented interface. Two types of objects are available: database handles and statement handles. Perl returns a database handle to the connect method like so: my $dbh = DBI->connect("DBI:MariaDB:database=$db;host=$host", $user, $password, { RaiseError => 1, PrintError => 0 }); Once you have connected to a database, you can execute SQL statements with: $dbh->do('INSERT INTO foo VALUES (?, ?)', undef, $number, $name); See DBI L method for details. See also the L method in L. See L below for more details on database handles. If you want to retrieve results, you need to create a so-called statement handle with: my $sth = $dbh->prepare('SELECT * FROM ' . $dbh->quote_identifier($table)); $sth->execute(); This statement handle can be used for multiple things. First of all you can retrieve a row of data: my $row = $sth->fetchrow_hashref(); If your table has columns C and C, then C<$row> will be hash ref with keys C and C. See L below for more details on statement handles. But now for a more formal approach: =head2 Class Methods =over =item connect use DBI; my $dsn = "DBI:MariaDB:$database"; my $dsn = "DBI:MariaDB:database=$database;host=$hostname"; my $dsn = "DBI:MariaDB:database=$database;host=$hostname;port=$port"; my $dsn = "DBI:MariaDB:database=$database;mariadb_socket=$socket"; my $dbh = DBI->connect($dsn, $user, $password); The I is not a required attribute, but please note that MariaDB and MySQL has no such thing as a default database. If you don't specify the database at connection time your active database will be null and you'd need to prefix your tables with the database name; i.e. C will return the current database active for the handle. =over =item host =item port The I, if not specified or specified as empty string or C, will default to a MariaDB or MySQL server running on the local machine using the default for the UNIX socket. To connect to a MariaDB or MySQL server on the local machine via TCP, you must specify the loopback IP address C<127.0.0.1> as the I. Should the MariaDB or MySQL server be running on a non-standard port number, you may explicitly state the C to connect to in the I argument, by concatenating the C and C together separated by a colon (C<:>) character or by using the I argument. To connect to a MariaDB or MySQL server on localhost using TCP/IP, you must specify the I as C<127.0.0.1> with the optional I, e.g. C<3306>. When connecting to a MariaDB or MySQL Server with IPv6, a bracketed IPv6 address should be used. Example DSN: my $dsn = 'DBI:MariaDB:;host=[1a12:2800:6f2:85::f20:8cf];port=3306'; =item mariadb_client_found_rows Enables (logical true value) or disables (logical false value) the flag C while connecting to the MariaDB or MySQL server. This has a somewhat funny effect. Without I, if you perform a query like UPDATE t SET id = 1 WHERE id = 1; then the MariaDB or MySQL engine will always return 0, because no rows have changed. With I however, it will return the number of rows that have an id 1, as some people are expecting. At least for compatibility to other engines. By default I is enabled. =item mariadb_compression If your DSN contains the option C, then the communication between client and server will be compressed. =item mariadb_connect_timeout If your DSN contains the option C, the connect request to the server will timeout if it has not been successful after the given number of seconds. Zero value means infinite timeout. =item mariadb_write_timeout If your DSN contains the option C, the write operation to the server will timeout if it has not been successful after the given number of seconds. Zero value means infinite timeout. =item mariadb_read_timeout If your DSN contains the option C, the read operation to the server will timeout if it has not been successful after the given number of seconds. Zero value means infinite timeout. =item mariadb_init_command If your DSN contains the option C, then this C statement is executed when connecting to the MariaDB or MySQL server. It is automatically re-executed if reconnection occurs. =item mariadb_skip_secure_auth This option is for older MySQL databases that don't have secure auth set. =item mariadb_read_default_file =item mariadb_read_default_group These options can be used to read a config file like F or F<~/.my.cnf>. By default MariaDB's and MySQL's C client library doesn't use any config files unlike the client programs (mysql, mysqladmin, ...) that do, but outside of the C client library. Thus you need to explicitly request reading a config file, as in my $dsn = 'DBI:MariaDB:test;mariadb_read_default_file=/home/joe/my.cnf'; my $dbh = DBI->connect($dsn, $user, $password); The option I can be used to specify the default group in the config file: Usually this is the C group, but see the following example: [client] host=localhost [perl] host=perlhost (Note the order of the entries! The example won't work, if you reverse the C<[client]> and C<[perl]> sections!) If you read this config file, then you'll be typically connected to C. However, by using my $dsn = 'DBI:MariaDB:test;mariadb_read_default_group=perl;' . 'mariadb_read_default_file=/home/joe/my.cnf'; my $dbh = DBI->connect($dsn, $user, $password); you'll be connected to C. Note that if you specify a default group and do not specify a file, then the default config files will all be read. See the documentation of the C function C for details. =item mariadb_socket It is possible to choose the Unix socket that is used for connecting to the server. This is done, for example, with my $dsn = 'DBI:MariaDB:database=test;' . 'mariadb_socket=/var/run/mysqld/mysqld.sock'; Usually there's no need for this option, unless you are using another location for the socket than that built into the client. =item mariadb_ssl A true value turns on the C flag when connecting to the MariaDB or MySQL server and enforce SSL encryption. A false value (which is default) disable SSL encryption with the MariaDB or MySQL server. When enabling SSL encryption you should set also other SSL options, at least L|/mariadb_ssl_ca_file> or L|/mariadb_ssl_ca_path>. my $dsn = 'DBI:MariaDB:database=test;host=hostname;port=3306;' . 'mariadb_ssl=1;mariadb_ssl_verify_server_cert=1;' . 'mariadb_ssl_ca_file=/path/to/ca_cert.pem'; This means that your communication with the server will be encrypted. =item mariadb_ssl_ca_file The path to a file in PEM format that contains a list of trusted SSL certificate authorities. When set MariaDB or MySQL server certificate is checked that it is signed by some CA certificate in the list. I value is not verified unless L|/mariadb_ssl_verify_server_cert> is enabled. =item mariadb_ssl_ca_path The path to a directory that contains trusted SSL certificate authority certificates in PEM format. When set MariaDB or MySQL server certificate is checked that it is signed by some CA certificate in the list. I value is not verified unless L|/mariadb_ssl_verify_server_cert> is enabled. Please note that this option is supported only if your MariaDB or MySQL client was compiled with OpenSSL library, and not with default yaSSL library. =item mariadb_ssl_verify_server_cert Checks the server's I value in the certificate that the server sends to the client. The client verifies that name against the host name the client uses for connecting to the server, and the connection fails if there is a mismatch. For encrypted connections, this option helps prevent man-in-the-middle attacks. Verification of the host name is disabled by default. =item mariadb_ssl_client_key The name of the SSL key file in PEM format to use for establishing a secure connection. =item mariadb_ssl_client_cert The name of the SSL certificate file in PEM format to use for establishing a secure connection. =item mariadb_ssl_cipher A list of permissible ciphers to use for connection encryption. If no cipher in the list is supported, encrypted connections will not work. mariadb_ssl_cipher=AES128-SHA mariadb_ssl_cipher=DHE-RSA-AES256-SHA:AES128-SHA =item mariadb_ssl_optional Setting I to true disables strict SSL enforcement and makes SSL connection optional. This option opens security hole for man-in-the-middle attacks. Default value is false which means that L|/mariadb_ssl> set to true enforces SSL encryption. Due to L and L vulnerabilities in libmariadb and libmysqlclient libraries, enforcement of SSL encryption was not possible and therefore C was effectively set for old DBD::mysql driver prior DBD::MariaDB fork was created. DBD::MariaDB with C could refuse connection to MariaDB or MySQL server if underlying libmariadb or libmysqlclient library is vulnerable. Option I can be used to make SSL connection vulnerable. =item mariadb_local_infile The C capability for C may be disabled in the MariaDB or MySQL client library by default. If your DSN contains the option C, C will be enabled. However, this option is B if the server has also been configured to disallow C. =item mariadb_multi_statements Support for multiple statements separated by a semicolon (C<;>) may be enabled by using this option. Enabling this option may cause problems if server-side prepared statements are also enabled. =item mariadb_server_prepare This option is used to enable server side prepared statements. By default prepared statements are not used and placeholder replacement is done by DBD::MariaDB prior to sending SQL statement to MariaDB or MySQL server. This default behavior may change in the future. To use server side prepared statements, all you need to do is set the variable I in the connect: my $dbh = DBI->connect( 'DBI:MariaDB:database=test;host=localhost;mariadb_server_prepare=1', 'user', 'password', { RaiseError => 1, PrintError => 0 }, ); or: my $dbh = DBI->connect( 'DBI:MariaDB:database=test;host=localhost', 'user', 'password', { RaiseError => 1, PrintError => 0, mariadb_server_prepare => 1 }, ); There are many benefits to using server side prepare statements, mostly if you are using SQL statements with placeholders or performing many inserts because of that fact that a single statement is prepared to accept multiple insert values. Please note that MariaDB or MySQL server cannot prepare or execute some prepared statements. In this case DBD::MariaDB fallbacks to normal non-prepared statement and tries again. =item mariadb_server_prepare_disable_fallback This option disable fallback to normal non-prepared statement when MariaDB or MySQL server does not support execution of current statement as prepared. Useful when you want to be sure that the statement is going to be executed as server side prepared. Error message and code in case of failure is propagated back to DBI. This default behavior may change in the future. =item mariadb_embedded_options The option I can be used to pass command line options to the embedded server. When you want to start and connect embedded server, use C in dsn as connection parameter. Example: use DBI; my $datadir = '/var/lib/mysql/'; my $langdir = '/usr/share/mysql/english'; my $dsn = 'DBI:MariaDB:host=embedded;database=test;' . "mariadb_embedded_options=--datadir=$datadir,--language=$langdir"; my $dbh = DBI->connect($dsn, undef, undef); This would start embedded server with language directory C<$langdir>, database directory C<$datadir> and connects to database C. Embedded server does not have to be supported by configured MariaDB or MySQL library. In that case Lconnect() >>|/connect> returns an error. =item mariadb_embedded_groups The option I can be used to specify the groups in the config file (F) which will be used to get options for the embedded server. If not specified C<[server]> and C<[embedded]> groups will be used. Example: my $dsn = 'DBI:MariaDB:host=embedded;database=test;' . 'mariadb_embedded_groups=embedded_server,common'; =item mariadb_conn_attrs The option I is a hash of attribute names and values which can be used to send custom connection attributes to the server. Some attributes like C<_os>, C<_platform>, C<_client_name> and C<_client_version> are added by libmariadb or libmysqlclient. You can then later read these attributes from the performance schema tables which can be quite helpful for profiling your database or creating statistics. You'll have to use both server and client at least in version MariaDB 10.0.5 or MySQL 5.6 to leverage this feature. It is a good idea to provides additional C attribute. my $dbh= DBI->connect($dsn, $user, $password, { AutoCommit => 0, mariadb_conn_attrs => { program_name => $0, foo => 'bar', wiz => 'bang' }, }); Now you can select the results from the performance schema tables. You can do this in the same session, but also afterwards. It can be very useful to answer questions like I my $results = $dbh->selectall_hashref( 'SELECT * FROM performance_schema.session_connect_attrs', 'ATTR_NAME' ); This returns: $result = { '_client_name' => { 'ATTR_VALUE' => 'libmysql', 'ATTR_NAME' => '_client_name', 'ORDINAL_POSITION' => '1', 'PROCESSLIST_ID' => '3', }, '_client_version' => { 'ATTR_VALUE' => '5.6.24', 'ATTR_NAME' => '_client_version', 'ORDINAL_POSITION' => '7', 'PROCESSLIST_ID' => '3', }, '_os' => { 'ATTR_VALUE' => 'osx10.8', 'ATTR_NAME' => '_os', 'ORDINAL_POSITION' => '0', 'PROCESSLIST_ID' => '3', }, '_pid' => { 'ATTR_VALUE' => '59860', 'ATTR_NAME' => '_pid', 'ORDINAL_POSITION' => '2', 'PROCESSLIST_ID' => '3', }, '_platform' => { 'ATTR_VALUE' => 'x86_64', 'ATTR_NAME' => '_platform', 'ORDINAL_POSITION' => '4', 'PROCESSLIST_ID' => '3', }, 'foo' => { 'ATTR_NAME' => 'foo', 'ATTR_VALUE' => 'bar', 'ORDINAL_POSITION' => '6', 'PROCESSLIST_ID' => '3', }, 'program_name' => { 'ATTR_VALUE' => './foo.pl', 'ATTR_NAME' => 'program_name', 'ORDINAL_POSITION' => '5', 'PROCESSLIST_ID' => '3', }, 'wiz' => { 'ATTR_VALUE' => 'bang', 'ATTR_NAME' => 'wiz', 'ORDINAL_POSITION' => '3', 'PROCESSLIST_ID' => '3', }, }; =back =item data_sources use DBI; my @dsns = DBI->data_sources('MariaDB', { host => $hostname, port => $port, user => $username, password => $password, ... }); Returns a list of all databases in dsn format suitable for L method, managed by the MariaDB or MySQL server. It accepts all attributes from L method. =back =head1 DATABASE HANDLES The DBD::MariaDB driver supports the following attributes of database handles (read only): my $errno = $dbh->{'mariadb_errno'}; my $error = $dbh->{'mariadb_error'}; my $hostinfo = $dbh->{'mariadb_hostinfo'}; my $info = $dbh->{'mariadb_info'}; my $insertid = $dbh->{'mariadb_insertid'}; my $protoinfo = $dbh->{'mariadb_protoinfo'}; my $serverinfo = $dbh->{'mariadb_serverinfo'}; my $ssl_cipher = $dbh->{'mariadb_ssl_cipher'}; my $stat = $dbh->{'mariadb_stat'}; my $thread_id = $dbh->{'mariadb_thread_id'}; These correspond to C, C, C, C, C, C, C, C, C and C respectively. Portable DBI applications should not use them. Instead they should use standard DBI methods: Lerr() >>|DBI/err> and Lerrstr() >>|DBI/errstr> for error number and string, C<< $dbh->get_info($GetInfoType{SQL_SERVER_NAME}) >> for server host name, C<< $dbh->get_info($GetInfoType{SQL_DBMS_NAME}) >> and C<< $dbh->get_info($GetInfoType{SQL_DBMS_VER}) >> for server database name and version, Llast_insert_id() >>|DBI/last_insert_id> or C<< $sth->last_insert_id() >> for insert id. =over 2 =item mariadb_clientinfo =item mariadb_clientversion List information of the MariaDB or MySQL client library that DBD::MariaDB was built against: print "$dbh->{mariadb_clientinfo}\n"; 5.2.0-MariaDB print "$dbh->{mariadb_clientversion}\n"; 50200 Portable DBI applications should not be interested in version of underlying client library. DBD::MariaDB is there to hide any possible incompatibility and works correctly with any available version. =item mariadb_serverversion print "$dbh->{mariadb_serverversion}\n"; 50200 Portable DBI applications should use C<< $dbh->get_info($GetInfoType{SQL_DBMS_NAME}) >> and C<< $dbh->get_info($GetInfoType{SQL_DBMS_VER}) >> for server database name and version instead. =item mariadb_ssl_cipher Returns the SSL encryption cipher used for the given connection to the server. In case SSL encryption was not enabled with L|/mariadb_ssl> or was not established returns C. my $ssl_cipher = $dbh->{mariadb_ssl_cipher}; if (defined $ssl_cipher) { print "Connection with server is encrypted with cipher: $ssl_cipher\n"; } else { print "Connection with server is not encrypted\n"; } =item mariadb_dbd_stats my $info_hashref = $dbh->{mariadb_dbd_stats}; DBD::MariaDB keeps track of some statistics in the I attribute. The following stats are being maintained: =over 8 =item auto_reconnects_ok The number of times that DBD::MariaDB successfully reconnected to the MariaDB or MySQL server. =item auto_reconnects_failed The number of times that DBD::MariaDB tried to reconnect to MariaDB or MySQL but failed. =back =back The DBD::MariaDB driver also supports the following attributes of database handles (read/write): =over =item mariadb_auto_reconnect This attribute determines whether DBD::MariaDB will automatically reconnect to MariaDB or MySQL server if the connection be lost. This feature defaults to off. Setting I to C<1> is not advised if C is used because if DBD::MariaDB reconnect to MariaDB or MySQL server all table locks will be lost. This attribute is ignored when L is turned off, and when L is turned off, DBD::MariaDB will not automatically reconnect to the server. It is also possible to set the default value of the I attribute for the C<$dbh> by passing it in the C<\%attr> hash for Lconnect >>|/connect>. $dbh->{mariadb_auto_reconnect} = 1; or my $dbh = DBI->connect($dsn, $user, $password, { mariadb_auto_reconnect => 1, }); Note that if you are using a module or framework that performs reconnections for you (for example L in fixup mode), this value must be set to C<0>. =item mariadb_use_result This attribute forces the driver to use C rather than C library function. The former is faster and less memory consuming, but tends to block other processes. C is the default due to that fact storing the result is expected behavior with most applications. It is possible to set the default value of the I attribute for the C<$dbh> via the DSN: my $dbh = DBI->connect('DBI:MariaDB:test;mariadb_use_result=1', $user, $pass); You can also set it after creation of the database handle: $dbh->{mariadb_use_result} = 0; # disable $dbh->{mariadb_use_result} = 1; # enable You can also set or unset the I setting on your statement handle, when creating the statement handle or after it has been created. See L. =item mariadb_bind_type_guessing This attribute causes the driver (emulated prepare statements) to attempt to guess if a value being bound is a numeric value, and if so, doesn't quote the value. This was created by Dragonchild and is one way to deal with the performance issue of using quotes in a statement that is inserting or updating a large numeric value. CAVEAT: Even though you can insert an integer value into a character column, if this column is indexed, if you query that column with the integer value not being quoted, it will not use the index: MariaDB [test]> explain select * from test where value0 = '3' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test type: ref possible_keys: value0 key: value0 key_len: 13 ref: const rows: 1 Extra: Using index condition 1 row in set (0.00 sec) MariaDB [test]> explain select * from test where value0 = 3 -> \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test type: ALL possible_keys: value0 key: NULL key_len: NULL ref: NULL rows: 6 Extra: Using where 1 row in set (0.00 sec) See bug: L I can be turned on via - through DSN my $dbh = DBI->connect('DBI:MariaDB:test', 'username', 'pass', { mariadb_bind_type_guessing => 1 }); - OR after handle creation $dbh->{mariadb_bind_type_guessing} = 1; =item mariadb_bind_comment_placeholders This attribute causes the driver (emulated prepare statements) will cause any placeholders in comments to be bound. This is not correct prepared statement behavior, but some developers have come to depend on this behavior. =item mariadb_no_autocommit_cmd This attribute causes the driver to not issue C either through explicit or using C. This is particularly useful in the case of using MySQL Proxy. See the bug report: L I can be turned on when creating the database handle: my $dbh = DBI->connect('DBI:MariaDB:test', 'username', 'pass', { mariadb_no_autocommit_cmd => 1 }); or using an existing database handle: $dbh->{mariadb_no_autocommit_cmd} = 1; =item mariadb_max_allowed_packet This attribute controls the maximum size of one packet, any generated or intermediate string and any bind parameter. Default value depends on client MariaDB/MySQL library and should be 1GB. $dbh->{mariadb_max_allowed_packet} = 32*1024*1024; # limit max size to 32MB =back Documentation for some DBD::MariaDB methods of database handles: =over 2 =item ping This can be used to send a ping to the server. See DBI L. my $rc = $dbh->ping(); =item get_info This method can be used to retrieve information about MariaDB or MySQL server. See DBI L. Some useful information: C returns server database name, either C or C. C returns server database version and C returns server host name. use DBI::Const::GetInfoType; print $dbh->get_info($GetInfoType{SQL_DBMS_NAME}); MariaDB print $dbh->get_info($GetInfoType{SQL_DBMS_VER}); 10.01.2600 print $dbh->get_info($GetInfoType{SQL_SERVER_NAME}); Localhost via UNIX socket =back =head1 STATEMENT HANDLES The statement handles of DBD::MariaDB support a number of attributes. You access these by using, for example, my $numFields = $sth->{NUM_OF_FIELDS}; Note, that most attributes are valid only after a successful L. An C value will returned otherwise. The most important exception is the L|/mariadb_use_result> attribute. To set the L|/mariadb_use_result> attribute on statement handle C<$sth>, use either of the following: my $sth = $dbh->prepare($sql, { mariadb_use_result => 1}); or my $sth = $dbh->prepare($sql); $sth->{mariadb_use_result} = 1; Column dependent attributes, for example I, the column names, are returned as a reference to an array. The array indices are corresponding to the indices of the arrays returned by L and similar methods. For example the following code will print a header of table names together with all rows: my $sth = $dbh->prepare('SELECT * FROM t') or die 'Error: ' . $dbh->errstr() . "\n"; $sth->execute() or die 'Error: ' . $sth->errstr() . "\n"; my $names = $sth->{NAME}; my $numFields = $sth->{'NUM_OF_FIELDS'} - 1; for my $i ( 0..$numFields ) { printf('%s%s', $i ? ',' : '', $$names[$i]); } print "\n"; while (my $ref = $sth->fetchrow_arrayref()) { for my $i ( 0..$numFields ) { printf('%s%s', $i ? ',' : '', $$ref[$i]); } print "\n"; } For portable applications you should restrict yourself to attributes with capitalized or mixed case names. Lower case attribute names are private to DBD::MariaDB. The attribute list includes: =over =item ChopBlanks This attribute determines whether a L will chop preceding and trailing blanks off the column values. Chopping blanks does not have impact on the L|/mariadb_max_length> attribute. =item mariadb_insertid If the statement you executed performs an C, and there is an C column in the table you inserted in, this attribute holds the value stored into the C column, if that value is automatically generated, by storing C or C<0> or was specified as an explicit value. Typically, you'd access the value via C<< $sth->{mariadb_insertid} >>. The value can also be accessed via C<< $dbh->{mariadb_insertid} >> but this can easily produce incorrect results in case one database handle is shared. Portable DBI applications should not use I. Instead they should use DBI method Llast_insert_id() >>|DBI/last_insert_id> or statement DBI method C<< $sth->last_insert_id() >>. Statement method was introduced in DBI version 1.642, but DBD::MariaDB implements it also for older DBI versions. =item mariadb_is_blob Reference to an array of boolean values; Logical true value indicates, that the respective column is a blob. =item mariadb_is_key Reference to an array of boolean values; Logical true value indicates, that the respective column is a key. =item mariadb_is_num Reference to an array of boolean values; Logical true value indicates, that the respective column contains numeric values. =item mariadb_is_pri_key Reference to an array of boolean values; Logical true value indicates, that the respective column is a primary key. =item mariadb_is_auto_increment Reference to an array of boolean values; Logical true value indicates that the respective column is an C column. =item mariadb_length =item mariadb_max_length A reference to an array of maximum column sizes. The I is the maximum physically present in the result table, I gives the theoretically possible maximum. For string orientated variable types (char, varchar, text and similar types) both attributes return value in bytes. If you are interested in number of characters then instead of I use C via standard DBI method L and instead of I issue SQL query C statement. You may use this for checking whether a statement returned a result: A zero value indicates a non-C