Como se conectar ao MySQL usando UTF8 dentro de um script perl?
Dentro de um script Perl: Como eu me conecto ao MySQL de uma maneira que permita transmitir o caractere unicode de quatro bytes U + 1F61C ("") do script perl para uma tabela MySQL onde esse caractere deve ser armazenado?
Usando{mysql_enable_utf8 => 1}
não resolve o problema.
Eu tenho exatamente o mesmo problema descrito na perguntaERRO 1366 (HY000): Valor incorreto da string: '\ xF0 \ x9F \ x98 \ x9C' para a coluna 'comment' na linha 1 e mesmo com o mesmo caractere Unicode (= U + 1F61C =CARA COM LÍNGUA STUCK-OUT E OLHO VENCEDOR) que produz a mensagem de erro
DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x98\x9C' for column ...
Mas eu não uso PHP, eu uso Perl.
A resposta aceita na outra pergunta diz:
Execute o MySQL 5.5 ou posterior.
Eu verifico a versão:
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 5.7.13-0ubuntu0.16.04.2 |
+-------------------------+
Portanto, é 5,7 o que é posterior a 5,5.
✅ verificado
Defina o caractere da tabela comoutf8mb4
.
Verifico o conjunto de caracteres do meu banco de dados, da minha tabela e até da coluna relatada:
mysql> SELECT default_character_set_name FROM information_schema.SCHEMATA
-> WHERE schema_name = "myDatabase";
+----------------------------+
| default_character_set_name |
+----------------------------+
| utf8mb4 |
+----------------------------+
mysql> SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
-> information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
-> WHERE CCSA.collation_name = T.table_collation
-> AND T.table_schema = "myDatabase"
-> AND T.table_name = "myTable";
+--------------------+
| character_set_name |
+--------------------+
| utf8mb4 |
+--------------------+
mysql> SELECT character_set_name FROM information_schema.`COLUMNS`
-> WHERE table_schema = "myDatabase"
-> AND table_name = "myTable"
-> AND column_name = "myColumn";
+--------------------+
| character_set_name |
+--------------------+
| utf8mb4 |
+--------------------+
Portanto, meu banco de dados, minha tabela e a coluna relatada usam o conjunto de caracteresutf8mb4
.
✅ verificado
Este parece ser o problema. oresponda a outra pergunta diz:
SET NAMES utf8
ou use uma opção ao conectar que o habilite de maneira semelhante.
Não sei comoSET NAMES utf8
dentro de um script perl, então fiz como fiz nos últimos anos. Eu acho que isso é "uma opção ao conectar que, da mesma forma, permite"
É no final da longa fila que começa commy $dbh = DBI->connect
:
#!/usr/bin/perl -w
use strict;
use warnings;
use utf8;
use Encode;
use DBI;
binmode STDOUT, ":utf8";
#Here I connect using the parameter mysql_enable_utf8 (create database handle):
my $dbh = DBI->connect('DBI:mysql:database=myDatabase;host=localhost','aUser','aPassword',{mysql_enable_utf8 => 1});
#Prepare the statement (create statement handle):
my $sth = $dbh->prepare('INSERT INTO `myTable` (`myColumn`) VALUES(?);');
#This doesn't work:
$sth->execute('');
#This doesn't work either:
$sth->execute(encode_utf8(''));
#end processing:
$dbh->disconnect();
exit(0);
Ambas as execuções geram o mesmo erro (apenas o número da linha no final é alterado):
DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x98\x9C' for column 'myColumn' at row 1 at myTestScript.pl line 16.
O que estou fazendo errado?
Como posso fazer melhor?