মাইএসকিউএল ডেটাবেসে ইমোজি চরিত্র কীভাবে সংরক্ষণ করবেন


172

আমি আমার প্রকল্পে ইমোজি চরিত্রটি ব্যবহার করছি। এই অক্ষরগুলিকে মাইএসকিএল ডাটাবেসে সংরক্ষণ করা হয়েছে (??) আমি ডেটাবেস ডিফল্ট কল্যানেশন ব্যবহার করেছিলাম utf8mb4_general_ci। এটা শো

1366 ভুল স্ট্রিংয়ের মান: সারি 1 এর কলাম 'মন্তব্য' এর জন্য '\ xF0 \ x9F \ x98 \ x83 \ xF0 \ x9F ...'


1
আপনি কিভাবে আপনার তথ্য সংরক্ষণ করছেন? আপনি কি আমাদের সেই কোডটি দেখাতে পারেন?
টমাস বুটেলার

1
আপনার মন্তব্যের জন্য ধন্যবাদ. আমি এই পরিবর্তন ডেটাবেস ডিফল্ট সংগ্রহের জন্য ** utf8mb4 ** হিসাবে সমাধান পেয়েছি এবং টেবিল সংগ্রহকে ** চরিত্র সেটটি utf8mb4 হিসাবে কল করুন utf8mb4_bin ** হিসাবে পরিবর্তন করেছি। ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
সেলভামণি পি

1
কোড: insert into tablename (column1,column2,column3,column4,column5,column6,column7) values ('273','3','Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌',49,1,'2016-09-13 08:02:29','2016-09-13 08:02:29'ডাটাবেস সংযোগে utf8mb4 সেট করুন: $database_connection = new mysqli($server, $user,$password,$database_name); $database_connection->set_charset("utf8mb4");
সেলভামণি পি

উত্তর:


29

পদক্ষেপ 1, আপনার ডাটাবেসের ডিফল্ট চরসেটটি পরিবর্তন করুন:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

পদক্ষেপ 2, টেবিল তৈরি করার সময় চরসেট সেট করুন:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

বা টেবিল পরিবর্তন করুন

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;

আমি এই প্রশ্নগুলি অনুসরণ করেছি এবং বন্ধ করে মাইএসকিএল সার্ভারটি পুনরায় শুরু করেছি, তবে আমি যখন আমার টেবিলের মধ্যে ইমোজিগুলি toোকানোর চেষ্টা করি তখনও আমি একই ত্রুটি পাই। INSERT ব্যতীত সমস্ত কমান্ড সফলভাবে পাস হয়েছে। INSERT INTO এন্ট্রি (তারিখ, সময়, ক্যাপশন) VALUES (2018-05-20 ', '12: 38: 00', 'ইমোজি সহ পরীক্ষার বিবরণ: 😊❤️'); কলামের সেটিংস হ'ল কোলেশন: utf8mb4_0900_ai_ci সংজ্ঞা: বিবরণ পাঠ্য

1
এটির কাজ করার জন্য আপনার সংযোগটিও utf8mb4 হওয়া দরকার।
হেনরিক হানসেন

3
@ স্পাইডার, দ্বিতীয় ধাপে আপনি ইউনিকোডের পরিবর্তে utfmb4_general_ci ব্যবহার করেন - কোনও কারণ কেন?
ওয়ারেন

263

1) ডাটাবেস: হিসাবে ডেটাবেস ডিফল্ট কোলেশন পরিবর্তন করুন utf8mb4

2) সারণী: হিসাবে সারণী কলেশন পরিবর্তন করুন CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

প্রশ্ন:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) কোড:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4) utf8mb4ডাটাবেস সংযোগ সেট করুন :

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');

4
এটি কি ডাটাবেস ডিফল্ট সংগ্রহ পরিবর্তন না করেই সম্ভব?
AliN11

23
এটি আমার জন্য কাজ করছে না। আমি "???" পাচ্ছি হাসির পরিবর্তে কেবল "☺" এটি হাসিমুখে নিরাপদে ডেটাবেসে তৈরি করেছে।
কৌতূহল বিকাশকারী

10
Utf8mb4 এ কেবল টেবিলটি আপডেট করার দরকার নেই, তবে কলামগুলিও তাদের নিজেরাই করা উচিত, অন্যথায় তারা এখনও প্রদর্শিত হতে পারে ?? পরিবর্তে 💙।
আলে

2
আমার জন্য কাজ করেছেন, তবে মাইএসকিউএল পুনরায় চালু করতে ভুলবেন না।
রবি মিশ্রা

8
SET NAMES utf8mb4;ইমোটিকন সংরক্ষণ শুরু করতে আমার দৌড়াতে হবে; এই আদেশের আগে এটি তাদের সংরক্ষণ করছিল??
কিউবুক

18

উভয় ডাটাবেস এবং টেবিলের অক্ষর সেট utf8mb4এবং সমষ্টি থাকতে হবে utf8mb4_unicode_ci

একটি নতুন ডাটাবেস তৈরি করার সময় আপনার ব্যবহার করা উচিত:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

আপনার যদি একটি বিদ্যমান ডাটাবেস থাকে এবং আপনি সমর্থন যুক্ত করতে চান:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

এছাড়াও আপনি প্রয়োজন সঠিক অক্ষর সেট এবং কোলেশন সেট আপনার সারণী জন্য:

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

বা যদি আপনি প্রচুর ডেটা সহ বিদ্যমান টেবিল পেয়ে থাকেন তবে এটি পরিবর্তন করুন:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

নোট করুন যে utf8_general_ciআর সেরা অভ্যাস সুপারিশ করা হয় না। সম্পর্কিত প্রশ্নোত্তর দেখুন:

স্ট্যাক ওভারফ্লোতে utf8_general_ci এবং utf8_unicode_ci এর মধ্যে পার্থক্য কী


আমি একটি ডাটাবেস এবং টেবিল ধারণকারী data.and আছে দ্বিতীয় দ্বিতীয় বিবৃতি নির্বাহ বলেছেন যে: ত্রুটি 1833 (HY000): যাবে না পরিবর্তন কলাম হল 'id': একটি বিদেশী কী বাধ্যতা টেবিলের 'FK12njtf8e0jmyb45lqfpt6ad89' 'lizbazi.post' ব্যবহৃত
সাইয়্যেদ মাহদিয়ার জেরেহপৌস

: - @SeyyedMahdiyarZerehpoush আপনি এখানে বর্ণিত, নির্দিষ্ট কলাম এটি প্রয়োজন আপনার আপডেট সীমিত দিয়ে পার পেতে সক্ষম হতে পারে stackoverflow.com/a/15781925/1247581 যেমনALTER TABLE mytable MODIFY my_emoji_friendly_text_column VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
theartofrain

utf8mb4_binবনাম utf8mb4_unicode_ciকলামগুলির জন্য ব্যবহার করার সময় কোনও ভিন্নতা আছে ?
মুহাম্মদ ওমর আসলাম

14

আপনি যদি সোলার + মাইকিউএল + জাভা ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন:

এটি ব্যবহার করা যেতে পারে:

  • কেস 1: আপনি যখন ডিবি পরিবর্তন করতে চান না।
  • কেস 2: আপনি যখন আপনার মাইএসকিএল থেকে সোলার কোর এ ইমোটিকনগুলি আমদানি করতে পারেন।

উপরের ক্ষেত্রে এটি আপনার সিস্টেমে আপনার ইমোটিকনগুলি সঞ্চয় করার সমাধানগুলির মধ্যে একটি।

এটি ব্যবহারের পদক্ষেপগুলি:

লাইব্রেরি ব্যবহৃত হয়েছে: java.net. URL ডেকোডার আমদানি করুন; আমদানি java.net.URLEncoder;

  1. আপনার স্ট্রিংটি ইমোটিকনযুক্ত এনকোড করতে urlEncoder ব্যবহার করুন।
  2. মাইএসকিএলডিবি পরিবর্তন না করে এটিকে ডিবিতে সঞ্চয় করুন।
  3. আপনি চাইলে সোলার কোর (ডিকোডেড ফর্ম) এ এটি সঞ্চয় করতে পারেন বা আপনি এনকোডযুক্ত ফর্মটি সংরক্ষণ করতে পারেন।
  4. ডিবি বা সোলার কোর থেকে এই ইমোটিকনগুলি আনার সময় আপনি এখন urlDecoder ব্যবহার করে এটি ডিকোড করতে পারেন।

কোড উদাহরণ:

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
টবি স্পিড 8

1
মনোমুগ্ধকর মতো কাজ করুন, আমি এটি মডেলটিতে ব্যবহার করেছি, সুতরাং আমার কোনও কোড এবং ডাটাবেস পরিবর্তনের দরকার নেই কেবলমাত্র
সেটিং

1
এনকোড / ডিকোড ফাংশন কলগুলির কারণ হয়ে থাকে। পরিবর্তে বিভিন্ন জায়গায় চরসেট সেটিংস ঠিক করুন।
রিক জেমস

1
এটি সমস্যার সমাধান করছে না, এটি এটিকে বাইপাস করছে। এবং আপনি এই পদ্ধতিতে প্রচুর সমস্যার মুখোমুখি হবেন, উদাহরণস্বরূপ আপনি আপনার অ্যাপ্লিকেশনটি ধীর করবে কারণ আপনাকে সমস্ত কিছু ডিকোড করতে এবং এনকোড করতে হবে। এছাড়াও আপনি যদি চরিত্রটি প্রবেশ করেন তবে %আপনার ডিকোডিংটি ভেঙে যাবে।
জোনাথন লালিবার্তে

14

আমি আমার ডাটাবেস এবং টেবিলটি utf8 থেকে utf8mb4 এ আপগ্রেড করতে আপডেট করেছি । তবে কিছুই আমার পক্ষে কাজ করে না। তারপরে আমি কলামটি ডেটাটাইপটি ব্লব করতে আপডেট করার চেষ্টা করেছি , ভাগ্যক্রমে এটি আমার জন্য কাজ করেছে এবং ডেটা সংরক্ষণ করা হয়েছে। এমনকি আমার ডাটাবেস এবং টেবিল উভয়ই বর্ণনামূলক সেট utf8 কল করুন utf8_unicode


13

কলামটি সংশোধন করার আদেশটি হ'ল:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

এবং আমাদের টাইপ = ব্যবহার করা দরকার BLOB

পরিবর্তনের উদাহরণ নিম্নরূপ:

ALTER TABLE messages MODIFY content BLOB;

আমি দেখেছি যে সর্বশেষতম মাইএসকিউএল এবং অন্যান্য ডাটাবেসগুলিকে ''টেবিলের নাম, কলাম_নাম ইত্যাদিতে কমান্ড ব্যবহার করার দরকার নেই

ডেটা আনুন এবং সংরক্ষণ করুন: চ্যাট সামগ্রীটি কলামে সরাসরি সংরক্ষণ করুন এবং ডেটা পুনরুদ্ধার করতে, (byte[])ডিবি কলাম থেকে বাইট অ্যারে হিসাবে ডেটা আনুন এবং তারপরে এটিকে রূপান্তর করুন string(জাভা কোড)

new String((byte[]) arr) 

2
হ্যাঁ. আপনার যদি কেবল একটি নির্দিষ্ট ক্ষেত্রে ইমোজিদের মতো ইউনিকোড সংরক্ষণ করতে হয় তবে স্বীকৃত উত্তরটি খুব অনুপ্রবেশমূলক, কেবল text/ varcharক্ষেত্রটিকে একটিতে পরিবর্তন করুন blobএবং আপনি হয়ে গেছেন। কেবল তার জন্য পুরো ডিবিতে
চরসেট

9

আমার উত্তরটি কেবল সেলভামণি পি উত্তরকে যুক্ত করে।

এর সাথে আপনার যে কোনও SET NAMES utf8প্রশ্নের পরিবর্তন করতে হবেSET NAMES utf8mb4 । এটা আমার জন্য কৌতুক করেছে।

এছাড়াও, আপনার ওয়েবসাইটটি utf8 থেকে utf8mb4 এ পোর্ট করার জন্য এটি একটি দুর্দান্ত নিবন্ধ । বিশেষত নিবন্ধটি utf8mb4 এ রূপান্তর করার পরে সূচীগুলি এবং মেরামতের টেবিলগুলিতে 2 টি ভাল পয়েন্ট তৈরি করেছে:

ইনডেক্সে

Utf8 থেকে utf8mb4 তে রূপান্তর করার সময়, কোনও কলাম বা সূচক কী এর সর্বোচ্চ দৈর্ঘ্য বাইটের ক্ষেত্রে অপরিবর্তিত থাকে। সুতরাং এটি অক্ষরের দিক থেকে ছোট, কারণ একটি চরিত্রের সর্বোচ্চ দৈর্ঘ্য এখন তিনটির পরিবর্তে চারটি বাইট। [...] ইনোডিবি স্টোরেজ ইঞ্জিনটির সর্বাধিক সূচক দৈর্ঘ্য 767 বাইট, সুতরাং utf8 বা utf8mb4 কলামের জন্য আপনি যথাক্রমে সর্বোচ্চ 255 বা 191 অক্ষরকে সূচক করতে পারেন। আপনার যদি বর্তমানে 191 টি অক্ষরের চেয়ে বেশি সূচী সহ utf8 কলাম রয়েছে তবে utf8mb4 ব্যবহার করার সময় আপনার স্বল্প সংখ্যার অক্ষর তৈরি করতে হবে।

টেবিলগুলি মেরামত করা

মাইএসকিউএল সার্ভারটি আপগ্রেড করার পরে এবং উপরে বর্ণিত প্রয়োজনীয় পরিবর্তনগুলি করার পরে, সমস্ত ডাটাবেস এবং টেবিলগুলি মেরামত ও অনুকূলিতকরণ করতে ভুলবেন না। আপগ্রেড করার পরে আমি এই মুহুর্তটি করিনি (প্রথম নজরে সবকিছু ঠিকঠাক বলে মনে হয়েছিল বলে আমি এটি প্রয়োজনীয় মনে করি নি), এবং এমন কিছু অদ্ভুত বাগের দিকে ছুটলাম যেখানে আপডেটের বিবৃতিগুলির কোনও প্রভাব নেই, যদিও নেই ত্রুটি নিক্ষেপ করা হয়েছিল।

নিবন্ধে টেবিলগুলি মেরামত করার প্রশ্নগুলি সম্পর্কে আরও পড়ুন।


REPAIR TABLEএবং OPTIMIZE TABLEএটি অপ্রয়োজনীয় হওয়া উচিত - ALTERএটির করার প্রভাব রয়েছে।
রিক জেমস

5

উপরোক্ত উত্তরে মূল বিষয়টি উল্লেখ করা হয়নি যে,

আমরা বিকল্প সহ কোয়েরি স্ট্রিং পাস করতে হবে "useUnicode=yes"এবং "characterEncoding=UTF-8"সংযোগ স্ট্রিং

এটার মতো কিছু

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8

5

ঠিক আছে, আপনার পুরো ডিবি চরসেট পরিবর্তন করার দরকার নেই। এর পরিবর্তে আপনি কলামটি ব্লব টাইপের পরিবর্তে এটি করতে পারেন ।

টেবিল বার্তাগুলি পরিবর্তিত করুন কন্টেন্ট ব্লগ;


3

আপনার সময় বাঁচানোর জন্য আমার একটি ভাল সমাধান রয়েছে have আমিও একই সমস্যাটি পূরণ করি তবে আমি প্রথম উত্তর দিয়ে এই সমস্যাটি সমাধান করতে পারিনি।

আপনার ডিফল্ট চরিত্রটি utf-8। তবে ইমোজিটিকে সমর্থন করার জন্য utf8mb4 দরকার। আপনার যদি মাইএসকিএল কনফিগার ফাইলটি সংশোধন করার অনুমতি পেয়ে থাকে তবে আপনি এই পদক্ষেপটি অনুসরণ করতে পারেন।

সুতরাং, আপনার অক্ষর সেটটি আপগ্রেড করতে নিম্নলিখিত পদক্ষেপটি করুন (utf-8 থেকে utf8mb4) to

পদক্ষেপ 1. মাইএসকিএল জন্য আপনার my.cnf খুলুন, নিম্নলিখিত নিম্নলিখিত লাইনগুলি আপনার my.cnf এ যুক্ত করুন।

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'

[mysql]
default-character-set = utf8mb4


[client]
default-character-set = utf8mb4

ধাপ ২. আপনার মাইএসকিএল পরিষেবা বন্ধ করুন এবং মাইএসকিএল পরিষেবা শুরু করুন

mysql.server stop
mysql.server start

শেষ! তারপরে আপনি পরীক্ষা করতে পারবেন আপনার চরিত্রটি utf8mb4 তে পরিবর্তিত হয়েছে।

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------------------+
| Variable_name            | Value                                                    |
+--------------------------+----------------------------------------------------------+
| character_set_client     | utf8mb4                                                  |
| character_set_connection | utf8mb4                                                  |
| character_set_database   | utf8mb4                                                  |
| character_set_filesystem | binary                                                   |
| character_set_results    | utf8mb4                                                  |
| character_set_server     | utf8mb4                                                  |
| character_set_system     | utf8                                                     |
| character_sets_dir       | /usr/local/Cellar/mysql@5.7/5.7.29/share/mysql/charsets/ |
+--------------------------+----------------------------------------------------------+
8 rows in set (0.00 sec)

2

প্রযুক্তি স্ট্যাকযুক্ত অ্যাপ্লিকেশনটির জন্য ইমোজি সমর্থন - মাইএসকিএল, জাভা, স্প্রিংবুট, হাইবারনেট

ইউনিকোড সমর্থনের জন্য মাইএসকিএল-এ পরিবর্তনগুলি নীচে প্রয়োগ করুন।

  1. ALTER DATABASE <database-name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  2. ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ডিবি সংযোগ - জেডিবিসি ইউআরএল পরিবর্তন:

jdbc:mysql://localhost:3306/<database-name>?useUnicode=yes&characterEncoding=UTF-8

দ্রষ্টব্য - উপরের পদক্ষেপটি যদি কাজ না করে থাকে তবে দয়া করে মাইএসকিএল-সংযোজক সংস্করণটি 8.0.15 এ আপডেট করুন। (মাইকিউএল 5.7 ইউনিকোড সমর্থনের জন্য 8.0.15 সংযোগকারী সংস্করণে কাজ করে)


1

আমার জন্য সবচেয়ে কার্যকর সমাধানটি হ'ল json_encode হিসাবে ডেটা সংরক্ষণ করা

পরে আপনি যখন পুনরুদ্ধার করবেন তখন নিশ্চিত করুন যে আপনি এটি json_decode করেছেন।

এখানে আপনার কোলেশন বা ডাটাবেস এবং টেবিলের অক্ষর সেটটি পরিবর্তন করতে হবে না।


0

(ডেস্কটপ AWS যদি RDS উপর আমার ক্ষেত্রে) একটি পরিচালিত মাইএসকিউএল উদাহরণস্বরূপ এই সমাধানের চেষ্টা যে কেউ জন্য, সবচেয়ে সহজ উপায় ছিল প্যারামিটার গ্রুপ সংশোধন এবং সেট সার্ভার অক্ষর সেট এবং কোলেশন হতে utf8mb4এবং utf8mb4_binযথাক্রমে। সার্ভারটি রিবুট করার পরে, একটি দ্রুত জিজ্ঞাসা সিস্টেম ডেটাবেস এবং যে কোনও নতুন তৈরি হওয়াগুলির জন্য সেটিংস যাচাই করে:

SELECT * FROM information_schema.SCHEMATA S;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.