কীভাবে মাইএসকিউএল হ্যান্ডেল ইউটিএফ -8 সঠিকভাবে করবেন


103

আমি গতকাল জিজ্ঞাসা করা একটি প্রশ্নের প্রতিক্রিয়াগুলির মধ্যে একটি প্রস্তাব দিয়েছে যে আমার ডাটাবেসটি ইউটিএফ -8 অক্ষর সঠিকভাবে পরিচালনা করতে পারে তা নিশ্চিত করা উচিত। আমি কীভাবে মাইএসকিউএল দিয়ে এটি করতে পারি?


4
আমি সত্যই আশা করি যে আমরা বিভিন্ন মাইএসকিউএল সংস্করণ, অসঙ্গতি ইত্যাদি coveringেকে দিয়ে একটি বিস্তৃত উত্তর পেয়েছি
এডওয়ার্ড জেড ইয়াং


4
@ এডওয়ার্ডজ.ইয়াং - মাইএসকিউএল ৪.১ প্রবর্তিত CHARACTER SETs; 5.1.24 জার্মান শার্প-এস (ß) এর মিলনের সাথে গণ্ডগোল পেয়েছিল, যা 5.1.62 (যুক্তিযুক্তভাবে বিষয়গুলিকে আরও খারাপ করে তোলে) এর মধ্যে অন্য কোলেশন যোগ করে সংশোধন করা হয়েছিল; 5.5.3 নতুন চরসেট utf8mb4 দিয়ে utf8 পূরণ হয়েছে 8
রিক জেমস

4
এই প্রশ্নটির সাথে এটি একই রকম .. দয়া করে সেই স্ট্যাকওভারফ্লোটি
নয়ন অং

এটি উল্লেখ করার মতো যে এইগুলির বেশিরভাগ উত্তর কেবল সাদাসিধা ভুল। ব্যবহার করবেন না utf8। এটি কেবল 3-বাইট অক্ষর পর্যন্ত সমর্থন করে। আপনার মাইএসকিউএল ব্যবহার করা উচিত সঠিক চরিত্র সেট utf8mb4
ব্রেন্ডন

উত্তর:


91

হালনাগাদ:

সংক্ষিপ্ত উত্তর - আপনার প্রায় সবসময় utf8mb4চরসেট এবং utf8mb4_unicode_ciকোলেশন ব্যবহার করা উচিত ।

ডাটাবেস পরিবর্তন করতে:

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

দেখা:

আসল উত্তর:

মাইএসকিউএল ৪.১ এবং তারপরে ইউটিএফ -8 এর একটি ডিফল্ট অক্ষর সেট রয়েছে। আপনি এটি আপনার my.cnfফাইলে যাচাই করতে পারেন , ক্লায়েন্ট এবং সার্ভার ( এবং ) উভয়ই সেট করতে মনে রাখবেন ।default-character-setcharacter-set-server

আপনি যদি ইউটিএফ -8 এ রূপান্তর করতে চান এমন বিদ্যমান ডেটা থাকে তবে আপনার ডাটাবেসটি ফেলে দিন এবং এটি নিশ্চিত করে ইউটিএফ -8 হিসাবে আবার আমদানি করুন:

  • SET NAMES utf8আপনি জিজ্ঞাসা / ডাটাবেসে সন্নিবেশ করার আগে ব্যবহার করুন
  • DEFAULT CHARSET=utf8নতুন টেবিল তৈরি করার সময় ব্যবহার করুন
  • এই মুহুর্তে আপনার মাইএসকিউএল ক্লায়েন্ট এবং সার্ভারটি ইউটিএফ -8 এ থাকা উচিত (দেখুন my.cnf)। মনে রাখবেন আপনি যে কোনও ভাষা ব্যবহার করেন (যেমন পিএইচপি) অবশ্যই ইউটিএফ -8 হতে হবে। পিএইচপি-র কিছু সংস্করণ তাদের নিজস্ব মাইএসকিউএল ক্লায়েন্ট লাইব্রেরি ব্যবহার করবে, যা ইউটিএফ -8 সচেতন নাও হতে পারে।

আপনি যদি বিদ্যমান ডেটা মাইগ্রেট করতে চান তবে প্রথমে ব্যাকআপের কথা মনে রাখবেন! যখন পরিকল্পনা অনুযায়ী জিনিসগুলি না যায় তখন প্রচুর অদ্ভুত ডেটা কাটা ঘটতে পারে!

কিছু সংস্থান:


29
আমার বোধগম্যতা হল যে utf8মাইএসকিউএল-র মধ্যে কেবল সম্পূর্ণ ইউনিকোডের একটি ছোট উপসেটকে বোঝায়। utf8mb4পরিবর্তে সম্পূর্ণ সমর্থন জোর করার জন্য আপনার ব্যবহার করা উচিত । দেখুন mathiasbynens.be/notes/mysql-utf8mb4 "একটি দীর্ঘ সময়ের জন্য, আমি জন্য ডেটাবেস টেবিল, এবং কলাম মাইএসকিউএল এর UTF8 অক্ষরসেট ব্যবহার করছিলেন অভিমানী এটি UTF-8 এনকোডিং উপরে বর্ণিত ম্যাপ।"
অ্যারন ম্যাকডেইড

7
মাইএসকিউএল-তে কখনও ইউটিএফ -8 -র কোনও ডিফল্ট অক্ষর সেট নেই। 4.1 এবং 5.x সর্বশেষ ব্যবহারের জন্য 5.7 latin1এবং latin1_swedish_ciডিফল্ট চরসেট এবং কোলেশন জন্য। : নিশ্চিতকরণ জন্য মাইএসকিউএল ম্যানুয়াল "সার্ভার অক্ষর সেট এবং কোলেশন" পৃষ্ঠা দেখুন dev.mysql.com/doc/refman/5.1/en/charset-server.html
সর্বপ্রাণবাদ

4
@ টিমটিসডল utf8mb4যখন বেশিরভাগ পাঠ্য ASCII হয় আপনার অতিরিক্ত সঞ্চয়স্থান গ্রহণ করার দরকার নেই । charস্ট্রিংগুলি পূর্বনির্ধারিত থাকলেও স্ট্রিংগুলি varcharনেই - এই ডকুমেন্টেশন পৃষ্ঠার শেষ কয়েকটি লাইন দেখুন । উদাহরণস্বরূপ, char(10)utf8mb4 এর অধীনে হতাশাজনকভাবে 40 বাইট সংরক্ষণ করা varchar(10)হবে তবে ভেরিয়েবলের দৈর্ঘ্যের এনকোডিংয়ের সাথে বাইটগুলি বরাদ্দ করা হবে।
কেভিন এ নাউডি

4
@ কেভিন আমি মনে করি আপনি এটি ভুলভাবে পড়েছেন। আমি মনে করি সারি সর্বাধিক দৈর্ঘ্য 64 কে। আপনি কেবলমাত্র একটি utf8mb4 ক্ষেত্র 1/4 করতে পারেন কারণ এটির পরিমাণ পরিমাণ সংরক্ষণ করতে হয়েছিল। সুতরাং, এটি যদি ASCII হয় তবে আপনি কেবল 16k অক্ষর সন্নিবেশ করতে পারেন।
টিম টিসডাল

4
@ টিমটিসডল ওহ, আপনি উপরের সীমানা সম্পর্কে কথা বলছেন। হ্যাঁ, সেগুলি কম। সৌভাগ্যবসত, মাইএসকিউএল বর্তমান সংস্করণ স্বয়ংক্রিয়ভাবে থেকে আপগ্রেড করবে varchar(n)করার textডাটা টাইপ আপনি একটি পরিবর্তন করার প্রচেষ্টা varchar(n)সম্ভবপর বাইট আকার চেয়ে বড় করার ক্ষেত্র (যখন একটি সতর্কবার্তা জারি)। একটি সূচকেও সবচেয়ে খারাপের উপরের বাউন্ড থাকতে পারে এবং এটি অন্যান্য সমস্যাগুলিও উপস্থিত করতে পারে।
কেভিন এ নাউডি

45

এটিকে 'স্থায়ী' করার জন্য my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

পরীক্ষা করতে, ক্লায়েন্টে যান এবং কিছু ভেরিয়েবলগুলি দেখান:

SHOW VARIABLES LIKE 'character_set%';

যাচাই করুন যে তারা সব করছি utf8ছাড়া ..._filesystem, যা হওয়া উচিত binaryএবং ..._dirযে কোথাও মাইএসকিউএল ইনস্টলেশন পয়েন্ট।


এটি আমার ক্ষেত্রে কার্যকর হয়নি তবে আমি যেভাবেই দেওয়া সামগ্রীর সাথে ফাইল / ফাইলগুলিতে মাই সিএফ তৈরি করেছি। আমি ব্যবহার করেছিcreate table my_name(field_name varchar(25) character set utf8);
মেরেক বার

"বর্ণের পছন্দগুলি দেখান 'অক্ষর_সেট%';" কমান্ডটি আমার সংযোগে সমস্যাটি প্রকাশ করেছে। ধন্যবাদ!
জাভসমো

4
এটি সঠিক নয়। মাইএসকিউএল যা বলে utf8তা "পূর্ণ" ইউটিএফ -8 নয়।
TWR কোল

32

মাইএসকিউএল ৪.১ এবং এর উপরে একটি ডিফল্ট অক্ষর সেট রয়েছে যা এটি কল করে utf8কিন্তু এটি আসলে ইউটিএফ -8 এর কেবলমাত্র একটি উপসেট (কেবল তিন-বাইট অক্ষর এবং আরও ছোটর জন্য অনুমতি দেয়)।

utf8mb4আপনি "পূর্ণ" ইউটিএফ -8 চাইলে আপনার চরসেট হিসাবে ব্যবহার করুন ।


5
অবশ্যই একমত, এটিই একমাত্র সঠিক উত্তর। utf8ইমোটিকনের মতো চরগুলি অন্তর্ভুক্ত করে না। utf8mb4করে কীভাবে আপডেট করবেন সে সম্পর্কে আরও তথ্যের জন্য এটি পরীক্ষা করুন: mathiasbynens.be/notes/mysql-utf8mb4
jibai31

@ বাসতি - বেশিরভাগই সঠিক (ল্যাটিন 1 হ'ল সম্প্রতি অবধি ডিফল্ট ছিল) এবং সম্পূর্ণ হয় না (utf8- এনকোডড ডেটা সঠিকভাবে সন্নিবেশ / নির্বাচন করা বা html এ প্রদর্শন করা যায় না)।
রিক জেমস

শ্রদ্ধার সাথে, @ রিক জেমস, বস্টি "এতদূর" বলেছিলেন - আমি যখন পোস্ট করেছি তখন আপনার উত্তর দেখে মনে নেই।
TWR কোল

হায়, ইউটিএফ 8 সমস্যার প্রায় 5 স্বতন্ত্র পৃথক উপসর্গ রয়েছে এবং প্রায় 4 টি জিনিস যা প্রোগ্রামাররা সমস্যার কারণ হয়ে ভুল করে। বেশিরভাগ উত্তর কেবলমাত্র একটি জিনিস দেখায় যা ফিক্সিংয়ের প্রয়োজন হতে পারে। মূল প্রশ্নটি ছিল একটি বিস্তৃত, সুতরাং উত্তরটির জন্য সমস্ত দরকার Perhaps. সম্ভবত বাস্টি এমন একটি লক্ষণের সাথে পরিচিত ছিলেন যার জন্য আপনার এক দিকটি সমাধান ছিল।
রিক জেমস

8
অন্যদিকে, আমি একটি মুহূর্ত বিরতি দিতে এবং মাইএসকিউএল টিমকে একটি খুব ভাল, শক্ত তাকাতে চাই। o_o ডাব্লুটিএফ আপনি কি ছেলেরা ভাবছিলেন? আপনি কি বুঝতে পেরেছেন যে আপনি "ইউটিএফ 8" নামক প্রোগ্রামটিতে কোডপেজ তৈরি করে আপনি যে পরিমাণ বিভ্রান্তি বপন করেছেন তা আসলে ইউটিএফ -8 নয়? গডমডন অ্যাসহোলস </rant>
TWR কোল

20

সংক্ষিপ্ত উত্তর: utf8mb44 জায়গায় ব্যবহার করুন :

  • আপনার ক্লায়েন্টের বাইটগুলি ইউটিএফ 8, লাতিন 1 / সিপি 1251 / ইত্যাদি নয়।
  • SET NAMES utf8mb4 বা মাইএসকিউএলে ক্লায়েন্টের সংযোগ স্থাপনের সময় সমতুল্য কিছু
  • CHARACTER SET utf8mb4 সমস্ত সারণী / কলামগুলিতে - কলামগুলি যা কঠোরভাবে ascii / hex / country_code / zip_code / ইত্যাদি except
  • <meta charset charset=UTF-8>যদি আপনি এইচটিএমএল আউটপুট হয়। (হ্যাঁ এখানে বানানটি আলাদা)

আরও তথ্য ;
সমস্তভাবে ইউটিএফ 8

উপরের লিঙ্কগুলি সরবরাহ করে "সমস্ত উদ্বেগের সমাধান করার জন্য বিশদ বিবরণী উত্তর প্রয়োজন"। - এই ফোরামে একটি স্থান সীমা আছে।

সম্পাদনা করুন

CHARACTER SET utf8mb4বিশ্বের সমস্ত অক্ষর "সমস্ত" ধারণ ছাড়াও , COLLATION utf8mb4_unicode_520_ciব্যবহারের জন্য 'সেরা সর্ব-চারপাশের' কোলেশনটি তর্কযোগ্য। (যারা এই ভাষাগুলিতে সংক্ষিপ্তসার চান তাদের জন্য তুর্কি, স্প্যানিশ ইত্যাদি সংগ্রহও রয়েছে))


আপনার প্রাপ্ত আউটপুট থেকে কীভাবে utf8 সমস্যাগুলি ডিবাগ করা যায় সে সম্পর্কে আমার নতুন লিঙ্ক
রিক জেমস

কেন unicode_520_ci সেরা চারদিকে নয় stackoverflow.com/a/49982378/62202
লুই

@ লুইস - এবং আমি স্প্যানিশ এবং তুর্কি (পাশাপাশি পোলিশ) ব্যবহারকারীদের খুশি করতে পারি না। "বেস্ট অল-চারপাশে" সকলকে কিছুটা আহত করে। মাইএসকিউএল 8.0 এর একটি আরও নতুন "সেরা" সমষ্টি রয়েছে : utf8mb4_0900_ai_ci । হায়রে আবার এল = Ł
রিক জেমস

4

চরসেট হ'ল ডাটাবেস (ডিফল্ট) এবং সারণীর একটি সম্পত্তি। আপনার একটি বর্ণন থাকতে পারে (মাইএসকিউএল কমান্ড):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

অন্য কথায়; আপনার ডাটাবেস চরসেটটি পরীক্ষা করা বা এটি পরিবর্তন করা বেশ সহজ:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;

4
এটি সঠিক নয়। মাইএসকিউএল যা বলে utf8তা "পূর্ণ" ইউটিএফ -8 নয়।
TWR কোল

3

ডাটাবেসের জন্য ইউটিএফ -8 এ অক্ষর সেট এনকোডিংটি পরিবর্তন করতে, mysql> প্রম্পটে নিম্নলিখিত কমান্ডটি টাইপ করুন। ব্যবহার করুন ALTER DATABASE.. ডাটাবেসের নাম দিয়ে DBNAME প্রতিস্থাপন করুন:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

এটি এই প্রশ্নের সদৃশ কীভাবে একটি সম্পূর্ণ মাইএসকিউএল ডাটাবেস অক্ষর এবং কোলেশনটিকে ইউটিএফ -8 এ রূপান্তর করতে হয়?


2

আমি জাভিয়েরের সমাধানটি অনুসরণ করেছি, তবে আমি আমার সিএনএফ-তে কিছু আলাদা লাইন যুক্ত করেছি:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

আমি এই ধারণাটি এখানে পেয়েছি: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html পৃষ্ঠার নীচে প্রথম / একমাত্র ব্যবহারকারী মন্তব্যে। তিনি উল্লেখ করেছেন যে স্কিপ-চরিত্র-সেট-ক্লায়েন্ট-হ্যান্ডশেকের কিছুটা গুরুত্ব রয়েছে।


এই প্রেমহীন, শূন্য-ভোটের উত্তরটি কেবল আমাকে সাহায্য করেছিল! সুতরাং এটি আমার ভোট পেয়েছে, এটি নিশ্চিত ভয়ঙ্কর। skip-character-set-client-handshakeচাবি ছিল।
মার্কাস


0

আপনার ডেটাবেস ডিফল্ট প্রয়োগ করার database collationজন্য সেট করুন ।UTF-8table collation


-1

আপনার উত্তরটি হ'ল আপনি মাই এসকিএল সেটিংস দ্বারা কনফিগার করতে পারেন। আমার উত্তরে প্রসঙ্গের বাইরে কিছু হতে পারে তবে এটি আপনার জন্য সহায়তা know
কিভাবে কনফিগার করতে হয় Character SetএবংCollation

ডিফল্ট মাইএসকিউএল অক্ষর সেট এবং কোলেশন ( latin1, latin1_swedish_ci) ব্যবহার করে এমন অ্যাপ্লিকেশনগুলির জন্য ডেটা সঞ্চয় করে , কোনও বিশেষ কনফিগারেশন প্রয়োজন হবে না। অ্যাপ্লিকেশনগুলিতে যদি একটি পৃথক অক্ষর সেট বা কোলেশন ব্যবহার করে ডেটা স্টোরেজ প্রয়োজন হয় তবে আপনি অক্ষর সেট তথ্য বিভিন্ন উপায়ে কনফিগার করতে পারেন:

  • প্রতিটি ডাটাবেস অক্ষর সেটিংস উল্লেখ করুন। উদাহরণস্বরূপ, যে অ্যাপ্লিকেশনগুলি একটি ডাটাবেস ব্যবহার করে তাদের প্রয়োজন হতে পারে utf8, অন্য অ্যাপ্লিকেশনগুলিতে অন্য ডাটাবেসগুলি ব্যবহার করার জন্য এসআইএসির প্রয়োজন হতে পারে।
  • সার্ভার স্টার্টআপে অক্ষর সেটিংস উল্লেখ করুন। এটি অন্যান্য ব্যবস্থা না করে এমন সমস্ত অ্যাপ্লিকেশনগুলির জন্য প্রদত্ত সেটিংসটি সার্ভারের কারণ হিসাবে ব্যবহার করে।
  • আপনি যদি উত্স থেকে মাইএসকিউএল তৈরি করেন তবে কনফিগারেশনের সময় অক্ষর সেটিংস উল্লেখ করুন । এটি সার্ভারকে সমস্ত অ্যাপ্লিকেশনের জন্য প্রদত্ত সেটিংসগুলি সার্ভার স্টার্টআপে নির্দিষ্ট না করেই ব্যবহার করে causes

আপনার প্রশ্নের জন্য utf8 অক্ষর সেট সেট করতে এখানে প্রদর্শিত উদাহরণগুলি এখানে আরও সহায়ক ( utf8_general_ciকোলেশন`) এর জন্য কোলেশন সেট করে ।

প্রতিটি ডাটাবেস অক্ষর সেটিংস উল্লেখ করুন

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

সার্ভার স্টার্টআপে অক্ষর সেটিংস উল্লেখ করুন

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

মাইএসকিউএল কনফিগারেশন সময় অক্ষর সেটিংস উল্লেখ করুন

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

আপনার সংযোগে প্রযোজ্য অক্ষর সেট এবং কোলেশন সিস্টেম ভেরিয়েবলের মানগুলি দেখতে, এই বিবৃতিগুলি ব্যবহার করুন:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

এটি দীর্ঘ উত্তর হতে পারে তবে সমস্ত উপায় আছে, আপনি ব্যবহার করতে পারেন। আশা করি আমার উত্তরটি আপনার পক্ষে সহায়ক। আরও তথ্যের জন্য http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


-2

SET NAMES UTF8

এই কৌশল হয়


4
SET NAMES UTF8(বা UTF8mb4) ব্যবহার করার সময় সঠিক, আপনি এটি ব্যাখ্যা করেন না যে এটি কী করে (এই সংযোগের জন্য ব্যবহৃত অক্ষর সেট)। "এটি কৌতুকটি করে" শোনার মতো এটি সমস্যার সমাধান করবে (মাইএসকিউএল হ্যান্ডেল ইউটিএফ -8 সঠিকভাবে তৈরি করুন), তবে অনেক মাইএসকিউএল ডাটাবেসগুলি ডিফল্টভাবে ল্যাটিন 1 এ সেট করা থাকে, যাতে এটি কোনও সঠিক সমাধান না করে। আমি ডিফল্ট চরসেট এবং টেবিলের অক্ষগুলি utf8mb4 তে পরিবর্তন করব। সত্যই, এই উত্তরটি বরং অসম্পূর্ণ, তাই আমি এটিকে হ্রাস করেছি।
বেসিক 6

-2

ইউটিএফ -8 এর সাথে ডেটাবেস সংযোগ

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());

-3

আপনার ডাটাবেস সংযোগটি ইউটিএফ 8 এ সেট করুন:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }

যদি পিএইচপি চলছে, অবহেলিত mysql_*ইন্টারফেসটি ব্যবহার করবেন না । স্যুইচ করুন mysqli_*বা PDO
রিক জেমস

-3

একটি সমাধান খুঁজে পেতে সক্ষম হয়েছিল। Http://technoguider.com/2015/05/utf8-set-up-in-mysql/ এ উল্লিখিত হিসাবে নিম্নলিখিতটি চালান

SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;

শেষ দুটি লাইন অপ্রয়োজনীয়, যেহেতু প্রথমটিতে ইতিমধ্যে সেগুলি অন্তর্ভুক্ত রয়েছে: dev.mysql.com/doc/refman/5.0/en/charset-connication.html
ড্যানিয়েলএম

এছাড়াও একটি সম্পূর্ণ সমাধান নয়। কলামগুলির প্রয়োজন CHARACTER SET utf8rootসর্বাত্মক কার্যকর করা হবে না init_connect
রিক জেমস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.