utf8mb4
कोलाज के साथ सेट चरित्र का उपयोग करना सबसे अच्छा है utf8mb4_unicode_ci
।
वर्ण सेट, utf8
केवल UTF-8 कोड बिंदुओं की एक छोटी राशि का समर्थन करता है, लगभग 6% संभावित वर्ण। utf8
केवल मूल बहुभाषी विमान (बीएमपी) का समर्थन करता है। वहाँ 16 अन्य विमानों। प्रत्येक विमान में 65,536 अक्षर हैं। utf8mb4
सभी 17 विमानों का समर्थन करता है।
MySQL दूषित डेटा के परिणामस्वरूप 4 बाइट UTF-8 वर्णों को काट देगा।
utf8mb4
वर्ण सेट 2010-03-24 पर MySQL 5.5.3 में पेश किया गया था।
नए वर्ण सेट का उपयोग करने के लिए कुछ आवश्यक परिवर्तन तुच्छ नहीं हैं:
- आपके एप्लिकेशन डेटाबेस एडॉप्टर में परिवर्तन किए जाने की आवश्यकता हो सकती है।
- वर्ण सेट करने, कोलाज़ बनाने और innodb_file_format को Barracuda में बदलने सहित my.cnf में परिवर्तन करने की आवश्यकता होगी
- SQL CREATE स्टेटमेंट में शामिल करने की आवश्यकता हो सकती है:
ROW_FORMAT=DYNAMIC
- DARAMAR को VARCHAR (192) और बड़े पर अनुक्रमित के लिए आवश्यक है।
नोट: से स्विच करने Barracuda
पर Antelope
, MySQL सेवा को एक से अधिक बार पुनरारंभ करने की आवश्यकता हो सकती है। innodb_file_format_max
जब तक MySQL सेवा को फिर से शुरू नहीं किया गया है: तब तक नहीं बदलता है innodb_file_format = barracuda
।
MySQL पुराने Antelope
InnoDB फ़ाइल स्वरूप का उपयोग करता है । Barracuda
गतिशील पंक्ति स्वरूपों का समर्थन करता है, जिन्हें आपको चार्ज करने के लिए स्विच करने के बाद अनुक्रमणिका और कुंजियाँ बनाने के लिए SQL त्रुटियों को नहीं मारना है:utf8mb4
- # 1709 - सूचकांक स्तंभ का आकार बहुत बड़ा है। अधिकतम कॉलम का आकार 767 बाइट्स है।
- # 1071 - निर्दिष्ट कुंजी बहुत लंबी थी; अधिकतम कुंजी लंबाई 767 बाइट्स है
निम्न परिदृश्य MySQL 5.6.17 पर परीक्षण किया गया है: डिफ़ॉल्ट रूप से, MySQL इस तरह कॉन्फ़िगर किया गया है:
SHOW VARIABLES;
innodb_large_prefix = OFF
innodb_file_format = Antelope
अपनी MySQL सेवा बंद करें और अपने मौजूदा my.cnf में विकल्प जोड़ें:
[client]
default-character-set= utf8mb4
[mysqld]
explicit_defaults_for_timestamp = true
innodb_large_prefix = true
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_file_per_table = true
# Character collation
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
उदाहरण SQL बनाएँ कथन:
CREATE TABLE Contacts (
id INT AUTO_INCREMENT NOT NULL,
ownerId INT DEFAULT NULL,
created timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
contact VARCHAR(640) NOT NULL,
prefix VARCHAR(128) NOT NULL,
first VARCHAR(128) NOT NULL,
middle VARCHAR(128) NOT NULL,
last VARCHAR(128) NOT NULL,
suffix VARCHAR(128) NOT NULL,
notes MEDIUMTEXT NOT NULL,
INDEX IDX_CA367725E05EFD25 (ownerId),
INDEX created (created),
INDEX modified_idx (modified),
INDEX contact_idx (contact),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB ROW_FORMAT=DYNAMIC;
- यदि आप क्रिएट स्टेटमेंट से हटाए गए हैं,
INDEX contact_idx (contact)
तो आप त्रुटि # 1709 देख सकते हैं ROW_FORMAT=DYNAMIC
।
नोट: contact
बाराकुडा का उपयोग करने की आवश्यकता को समाप्त करने पर पहले 128 अक्षरों तक सीमित करने के लिए सूचकांक को बदलनाROW_FORMAT=DYNAMIC
INDEX contact_idx (contact(128)),
यह भी ध्यान दें: जब यह कहता है कि फ़ील्ड का आकार VARCHAR(128)
128 बाइट्स नहीं है। आप 128, 4 बाइट वर्ण या 128, 1 बाइट वर्ण का उपयोग कर सकते हैं।
इस INSERT
कथन में 2 पंक्ति में 4 बाइट 'पू' वर्ण होना चाहिए:
INSERT INTO `Contacts` (`id`, `ownerId`, `created`, `modified`, `contact`, `prefix`, `first`, `middle`, `last`, `suffix`, `notes`) VALUES
(1, NULL, '0000-00-00 00:00:00', '2014-08-25 03:00:36', '1234567890', '12345678901234567890', '1234567890123456789012345678901234567890', '1234567890123456789012345678901234567890', '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678', '', ''),
(2, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', ''),
(3, NULL, '0000-00-00 00:00:00', '2014-08-25 03:05:57', 'poo', '12345678901234567890', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '123💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩💩', '', '');
आप last
कॉलम द्वारा उपयोग किए जाने वाले स्थान की मात्रा देख सकते हैं :
mysql> SELECT BIT_LENGTH(`last`), CHAR_LENGTH(`last`) FROM `Contacts`;
+--------------------+---------------------+
| BIT_LENGTH(`last`) | CHAR_LENGTH(`last`) |
+--------------------+---------------------+
| 1024 | 128 | -- All characters are ASCII
| 4096 | 128 | -- All characters are 4 bytes
| 4024 | 128 | -- 3 characters are ASCII, 125 are 4 bytes
+--------------------+---------------------+
अपने डेटाबेस एडॉप्टर में, आप अपने कनेक्शन के लिए चारसेट और कॉलेशन सेट करना चाहते हैं:
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'
PHP में, इसके लिए सेट किया जाएगा: \PDO::MYSQL_ATTR_INIT_COMMAND
संदर्भ: