एक Perl स्क्रिप्ट के भीतर UTF8 का उपयोग कर MySQL से कनेक्ट करने के लिए कैसे?



unicode utf-8 (1)

संक्षेप में:

पर्ल-स्क्रिप्ट के भीतर: मैं एक तरह से MySQL से कैसे जुड़ूंगा जिससे चार-बाइट यूनिकोड वर्ण U + 1F61C ("😜") को पर्ल स्क्रिप्ट से एक MySQL-Table तक संचारित करने की अनुमति मिलती है, जहां यह वर्ण संग्रहीत किया जाना चाहिए?

{mysql_enable_utf8 => 1} का उपयोग करना समस्या का समाधान नहीं करता है

विस्तार से:

प्रश्न ERROR 1366 (HY000) में बताए अनुसार मुझे ठीक उसी समस्या है : गलत स्ट्रिंग मान: पंक्ति 1 पर कॉलम के लिए '\ xF0 \ x9F \ x98 \ x9C' और यहां तक ​​कि एक ही यूनिकोड वर्ण (😜 = यू के साथ) + 1F61C = गड़गड़ाहट और विक्षुब्ध आँख के साथ चेहरा ) जो त्रुटि संदेश उत्पन्न करता है

DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x98\x9C' for column ...

लेकिन मैं PHP का उपयोग नहीं करता, मैं पर्ल का उपयोग करता हूं

दूसरे प्रश्न में स्वीकृत उत्तर कहते हैं:

  • MySQL 5.5 या बाद का संस्करण चलाएं।
    मैं संस्करण की जांच करता हूं:

    mysql> select version();
    +-------------------------+
    | version()               |
    +-------------------------+
    | 5.7.13-0ubuntu0.16.04.2 |
    +-------------------------+

    तो यह 5.7 है जो बाद में 5.5 है।
    ✅checked

  • मेज के चरित्र को utf8mb4 सेट करें
    मैं अपने डेटाबेस के चरित्र सेट, मेरी मेज और यहां तक ​​कि रिपोर्ट किए गए कॉलम की जांच कर रहा हूं:

    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            |
    +--------------------+

    इसलिए मेरे डेटाबेस, मेरी तालिका और रिपोर्ट की गई कॉलम सभी वर्ण सेट utf8mb4 उपयोग करते हैं।
    ✅checked

  • अपने MySQL कनेक्शन पर UTF8 सक्षम करें
    यह समस्या लगता है दूसरे प्रश्न का उत्तर कहते हैं:

    SET NAMES utf8 , या एक विकल्प का उपयोग करते हुए इसे इसी तरह सक्षम करता है।

मुझे नहीं पता कि एक perl स्क्रिप्ट के भीतर SET NAMES utf8 कैसे SET NAMES utf8 , इसलिए मैंने यह किया कि मैंने पिछले वर्षों में यह कैसे किया। मुझे लगता है कि यह " एक विकल्प है जो इसी तरह से सक्षम करता है इसे सक्षम करता है "।
यह my $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);

दोनों ही त्रुटि को फेंकते हैं (अंत में केवल लाइन नंबर बदलता है):

DBD::mysql::st execute failed: Incorrect string value: '\xF0\x9F\x98\x9C' for column 'myColumn' at row 1 at myTestScript.pl line 16.

मैं क्या गलत कर रहा हूं?
मैं इसे बेहतर कैसे कर सकता हूं?


समस्या SET NAMES utf8 आदेश के साथ है MySQL में utf8 वर्ण सेट वास्तव में utf8 नहीं है, यह केवल 3 बाइट्स के वर्णों का समर्थन करता है और प्रश्न के चरित्र में 4 बाइट्स हैं:

MySQL में utf8 वर्ण सेट इन विशेषताओं हैं:

• पूरक वर्णों के लिए कोई समर्थन नहीं (केवल बीएमपी वर्ण)

• अधिकतम प्रति बाइट्स प्रत्येक बाइबिट वर्ण।

सच utf8 utf8mb4 है कि आप फ़ील्ड में चरित्र सेट के रूप में उपयोग करते हैं। इसलिए, SET NAMES utf8mb4 उपयोग करें

इसलिए पर्ल से आपको {mysql_enable_utf8mb4 => 1} बजाय {mysql_enable_utf8 => 1} उपयोग करना चाहिए।





utf-8