কিভাবে একটি ডাটাবেস জুড়ে অক্ষর সেট (এবং কলকরণ) পরিবর্তন করবেন?


172

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

কোলেশন পরিবর্তন এবং চরিত্রের বিশদ ফিরে পাওয়া সম্ভব?



'???' এর সাথে কোলেশনসের কী সম্পর্ক আছে? অক্ষর সেট? আমি ভেবেছিলাম চরিত্রের সেটটি কি করা উচিত?
পিটারচৌলা

উদ্দেশ্যটি প্রতিফলিত করতে আমি শিরোনামটি পরিবর্তন করছি। একটি ডাটাবেসের জন্য ডিফল্ট কোলেশন পরিবর্তন করা পছন্দসই চেয়ে কম।
রিক জেমস

উত্তর:


365

ডাটাবেস কোলেশন পরিবর্তন করুন:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8mb4_0900_ai_ci;

টেবিলের জোট পরিবর্তন করুন:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8mb4_0900_ai_ci;

কলামের জোট পরিবর্তন করুন:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8mb4_0900_ai_ci;

অংশগুলির utf8mb4_0900_ai_ciঅর্থ কী?

3 bytes -- utf8
4 bytes -- utf8mb4 (new)
v4.0 --   _unicode_
v5.20 --  _unicode_520_
v9.0 --   _0900_ (new)
_bin      -- just compare the bits; don't consider case folding, accents, etc
_ci       -- explicitly case insensitive (A=a) and implicitly accent insensitive (a=á)
_ai_ci    -- explicitly case insensitive and accent insensitive
_as (etc) -- accent-sensitive (etc)
_bin         -- simple, fast
_general_ci  -- fails to compare multiple letters; eg ss=ß, somewhat fast
...          -- slower
_0900_       -- (8.0) much faster because of a rewrite

অধিক তথ্য:


4
সাবধান CHARACTER SET utf8ডিফল্ট করবে utf8_general_ciকিন্তু আপনার কাছে ভালো কোলেশন বর্ণনা করতে পারেন ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;প্রয়োজনে
KCD

1
... এবং আমি আপনাকে এটি পরীক্ষা করার পরামর্শ দিচ্ছিcreate table testit(a varchar(1)); show create table testit \G drop table testit;
কেসিডি

2
কেবল উল্লেখ করতে চাই যে দ্বিতীয়টি কোলেশনকে পরিবর্তিত করবে utf8_general_ci; আপনি এটি পরিবর্তন করতে চান তাহলে utf8_unicode_ci, আপনি কোলেশন সংজ্ঞায়িত করতে পারেন: ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;। @KCD যেমন উল্লেখ করেছে যে এটি ডাটাবেসে যেমন কাজ করে ঠিক তেমন টেবিলগুলিতে এটি কাজ করে।
বুদ্ধিমান

9
সম্পূর্ণ ইউটিএফ 8 সমর্থনের জন্য নিম্নলিখিতটি করা ভাল ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci। অন্য দুটি বিবৃতিতে আপনার একই কাজ করা উচিত।
গ্রিসো

আপনার কি সত্যিই "অলটার টেবিলে <টেবিল_নাম> মোডিফাই <কলাম / নাম> ..." ব্যবহার করা দরকার। Dev.mysql.com/doc/refman/5.5/en/alter-table.html এর মতে এটি "টেবিল < টেবিল_নাম > চরিত্রের সেট থেকে কনভার্ট ..." এছাড়াও কলামগুলি পরিবর্তন করে? অথবা হতে পারে আমি সঠিকভাবে ম্যানুয়ালটি পড়ছি / বুঝতে পারছি না।
হ্যান্সফন

49

কীভাবে সমস্ত ডাটাবেস / টেবিল / কলাম পরিবর্তন করবেন। এই ক্যোয়ারীগুলি চালনা করুন এবং আপনার সম্পূর্ণ স্কিমাটি ইউটিএফ 8 তে রূপান্তর করতে প্রয়োজনীয় পরবর্তী সমস্ত ক্যোয়ারী আউটপুট দেবে। আশাকরি এটা সাহায্য করবে!

- ডেটাবাসের ডিফল্ট সংযোগ পরিবর্তন করুন

SELECT DISTINCT concat('ALTER DATABASE `', TABLE_SCHEMA, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;')
from information_schema.tables
where TABLE_SCHEMA like  'database_name';

- টেবিল কলেশন / চর সেট পরিবর্তন করুন

SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;')
from information_schema.tables
where TABLE_SCHEMA like 'database_name';

- কলাম কোলেশন / চর সেট পরিবর্তন করুন

SELECT concat('ALTER TABLE `', t1.TABLE_SCHEMA, '`.`', t1.table_name, '` MODIFY `', t1.column_name, '` ', t1.data_type , '(' , t1.CHARACTER_MAXIMUM_LENGTH , ')' , ' CHARACTER SET utf8 COLLATE utf8_unicode_ci;')
from information_schema.columns t1
where t1.TABLE_SCHEMA like 'database_name' and t1.COLLATION_NAME = 'old_charset_name';

ভাল. ! প্রায় একই ঘন্টাটি আমি একই সমস্যাটি সমাধান করার চেষ্টা করছি। আমি এই 3 টি কমান্ড ব্যবহার করি এবং আমি দেখেছিলাম যে অক্ষরটি পরিবর্তন হয়েছে। তবে মূল সমস্যাটি আমার কাছে রয়ে গেছে। আমি যদি সরাসরি ডাটাবেসে লিখি তবে আমার ব্রাউজারে সবকিছু ভালভাবে প্রদর্শিত হয়। তবে আমি যদি ওয়েবসাইট ফর্ম থেকে কিছু সামগ্রী যুক্ত করি তবে ডাটাবেসের ফলাফল কেবল ??????? আমার কিছু বিবেচনা করা উচিত? আমার ওয়েব অ্যাপ্লিকেশন একটি। নেট এমভিসি অ্যাপ্লিকেশন।
Tchaps

ভবিষ্যতের প্রকল্পগুলির জন্য দরকারী প্রশ্নের মধ্যে সংরক্ষণ করা।
মানাটেক্স

আমি কিছু সম্পাদনার পরামর্শ দিয়েছি কারণ এই স্বয়ংক্রিয় প্রশ্নগুলি এখনও ব্যবহারের জন্য যথেষ্ট নিরাপদ ছিল না। CHARACTER_MAXIMUM_LENGTH এর সাথে এখনও একটি সমস্যা রয়েছে: আপনি উদাহরণস্বরূপ লাতিন 1_সুইডিশ_সি থেকে utf8_unicode_ci এ পরিবর্তন করলে মূলটি খুব বেশি হতে পারে।
রুবেন 15

1
এটি একটি দুর্দান্ত উত্তর। আমার কাছে তিনটি মন্তব্য / প্রশ্ন রয়েছে: 1) COLUMN- কোডে "t1" ব্যবহার কেন? আমি এর কোন প্রয়োজন দেখছি না। 2) কেন "t1.data_type, '(', 't1.CHARACTER_MAXIMUM_LENGTH,') '" এবং কেবল "t1. কলাম_প্রকার" নয়? 3) কেন আপার কেস এবং লোয়ার কেসের মিশ্রণ - TABLE_SCHEMA বনাম টেবিলের নাম এবং তাই?
hansfn

25

সাবধান থাকুন যে utf8মাইকিউএল-তে অক্ষর সেটটি সত্যিকারের ইউটিএফ 8 অক্ষর সেটের কেবলমাত্র একটি উপসেট। এক বাইট স্টোরেজ সংরক্ষণ করার জন্য, মাইএসকিএল টিম পূর্ণ চার-বাইটের পরিবর্তে কেবলমাত্র ইউটিএফ 8 অক্ষরের তিনটি বাইট সংরক্ষণ করার সিদ্ধান্ত নিয়েছে। এর অর্থ কিছু পূর্ব এশীয় ভাষা এবং ইমোজি সম্পূর্ণরূপে সমর্থিত নয়। তা নিশ্চিত করতে সব UTF8 হওয়া অক্ষর, সংরক্ষণ ব্যবহার করতে পারেন utf8mb4ডাটা টাইপ, এবং utf8mb4_binবা utf8mb4_general_ciমাইএসকিউএল হবে।


1
এখনই, এটির utf8mb4_unicode_ciপরিবর্তে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে utf8mb4_general_ci। দেখুন stackoverflow.com/questions/766809/... এবং drupal.stackexchange.com/questions/166405/...
রবিন ভ্যান Baalen

6

ডেভিড হুইটেকার যা পোস্ট করেছেন তাতে যুক্ত করে আমি এমন একটি কোয়েরি তৈরি করেছি যা সম্পূর্ণ টেবিল এবং কলামগুলিকে পরিবর্তনের বিবরণ তৈরি করে যা প্রতিটি টেবিলকে রূপান্তরিত করে। এটি চালানো ভাল ধারণা হতে পারে

সেট সেশন গ্রুপ_ক্যাঙ্ক_ম্যাক্স_লেন = 100000;

প্রথম নিশ্চিত করুন যে আপনার গ্রুপ CONCAT খুব ছোট সীমা ওভার যেতে না হিসাবে দেখা করতে এখানে

     SELECT a.table_name, concat('ALTER TABLE ', a.table_schema, '.', a.table_name, ' DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci, ',
        group_concat(distinct(concat(' MODIFY ',  column_name, ' ', column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ', if (is_nullable = 'NO', ' NOT', ''), ' NULL ',
        if (COLUMN_DEFAULT is not null, CONCAT(' DEFAULT \'', COLUMN_DEFAULT, '\''), ''), if (EXTRA != '', CONCAT(' ', EXTRA), '')))), ';') as alter_statement
    FROM information_schema.columns a
    INNER JOIN INFORMATION_SCHEMA.TABLES b ON a.TABLE_CATALOG = b.TABLE_CATALOG
        AND a.TABLE_SCHEMA = b.TABLE_SCHEMA
        AND a.TABLE_NAME = b.TABLE_NAME
        AND b.table_type != 'view'
    WHERE a.table_schema = ? and (collation_name = 'latin1_swedish_ci' or collation_name = 'utf8mb4_general_ci')
    GROUP BY table_name;

পূর্ববর্তী উত্তরের মধ্যে একটি পার্থক্য হ'ল এটি ut8mb4 এর পরিবর্তে utf8 ব্যবহার করছিল এবং t1.data_type ব্যবহার করে t1.CHARACTER_MAXIMUM_LENGTH এনমগুলির পক্ষে কাজ করে না। এছাড়াও, আমার কোয়েরি দর্শনগুলি বাদ দেয় না কারণ সেগুলি পৃথকভাবে পরিবর্তন করতে হবে।

এই সমস্ত পরিবর্তনগুলি অ্যারে হিসাবে ফিরিয়ে দেওয়ার জন্য আমি কেবল একটি পার্ল স্ক্রিপ্ট ব্যবহার করেছি এবং তাদের উপরে পুনরাবৃত্তি করেছি, কলামগুলি দীর্ঘায়িত করা হয়েছে (সাধারণত তারা বর্ণচর (256) ছিল যখন তথ্যগুলিতে সাধারণত 20 অক্ষর থাকে তাই এটি ছিল একটি সহজ সমাধান) )।

আমি দেখেছি যে ল্যাটিন 1 -> utf8mb4 থেকে পরিবর্তন করার সময় কিছু ডেটা দূষিত হয়েছিল। এটি কলামগুলিতে utf8 এনকোডেড ল্যাটিন 1 অক্ষর রূপান্তরিত হয়ে যাবে। আমি যে কলামগুলি জানতাম তা কেবল পরিবর্তকের আগে এবং পরে মেমরিতে একটি সমস্যা হতে চলেছে এবং তাদের তুলনা করে এবং ডেটা ঠিক করার জন্য আপডেট বিবৃতি উত্পন্ন করেছিল generated


4

এখানে প্রক্রিয়াটি ভালভাবে বর্ণনা করা হয়েছে । তবে ল্যাটিন স্পেসে ফিট না হওয়া কিছু চরিত্র চিরতরে চলে গেছে। ইউটিএফ -8 ল্যাটিন 1 এর একটি সুপারসেট UP বিপরীত নয়। বেশিরভাগগুলি একক বাইট স্পেসে খাপ খায়, তবে কোনও অপরিবর্তিত অক্ষরগুলি (ল্যাটিন 1 এর একটি তালিকা পরীক্ষা করে দেখুন - সমস্ত 256 অক্ষর মাইএসকিএল এর ল্যাটিন 1 সংজ্ঞা অনুসারে সংজ্ঞায়িত করা হয় না)

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