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


459

আমি কীভাবে পুরো মাইএসকিউএল ডাটাবেস চরিত্র-সেটটিকে ইউটিএফ -8 এবং কোলেশনটিকে ইউটিএফ -8 এ রূপান্তর করতে পারি?


22
পরবর্তী দর্শকদের জন্য: সাইডবারে সম্পর্কিত প্রশ্নগুলি নোট করুন এবং ব্যবহার করুন utf8_unicode_ci, না utf8_general_ci
ফুসিয়া

14
আপনি সম্পূর্ণ হল UTF-8 সমর্থন চান আপনি সম্ভবত এছাড়াও একটি অক্ষর সেট ব্যবহার করতে চাইবেন utf8mb4বদলে utf8যেমন utf8শুধুমাত্র মৌলিক বহুভাষী সমতল হিসাবে সম্পূর্ণ পরিসর উল্টোদিকে সমর্থন করে। এটির জন্য মাইএসকিউএল 5.5.3 বা তার বেশি প্রয়োজন।
মার্টিন স্টিল

4
আমি উপরের আমার মন্তব্যে উল্লেখ করতে ভুলে গেছি, আপনি যদি স্যুইচ করেন তবে utf8mb4আপনার কাছে কোলেশনও স্যুইচ করতে হবেutf8mb4_unicode_ci
মার্টিন স্টিল

3
আরও ভাল, কোলেশন utf8mb4_unicode_520_ciবা সর্বশেষ উপলব্ধ সংস্করণ যাই হোক না কেন।
রিক জেমস

@ মার্টিনস্টিল আমি বিশ্বাস করি যে ডিফল্টরূপে এই চরিত্রের সেটটি সহ কোলেশন।
ভ্যাটো

উত্তর:


715

ALTER DATABASEএবং ALTER TABLEকমান্ড ব্যবহার করুন ।

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

বা আপনি যদি এখনও মাইএসকিউএল 5.5.2 বা তার বেশি বয়সের হয়ে থাকেন যা 4-বাইট ইউটিএফ -8 সমর্থন করে না তবে এর utf8পরিবর্তে ব্যবহার করুন utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
CONVERT TOকৌশল ধরে নেয় যে টেক্সট ছিল সঠিকভাবে অন্য কিছু অক্ষরসেট সঞ্চিত (যেমন, latin1), এবং (যেমন হল UTF-8 বাইট latin1 রূপান্তর ছাড়া latin1 কলাম জোর করে ঠেসে হিসাবে) mangled না।
রিক জেমস

1
এটি বৃহত উত্পাদন সিস্টেমে এটি অক্ষম করে তোলে টেবিলটি পুনর্নির্মাণ করে। যদি এটি নিশ্চিত হয় যে কেবলমাত্র ASCII অক্ষরগুলি লাতিন 1 কলামগুলিতে সঞ্চিত আছে, তবে পুনর্নির্মাণ না করে টেবিলের অক্ষর / কোলেশন পরিবর্তন করা সম্ভব?
অ্যান্ড্রু

@ অ্যান্ড্রু বড় উত্পাদন ব্যবস্থাগুলিতে রক্ষণাবেক্ষণের জন্য সাধারণত মিররযুক্ত ডিবি থাকে।
BalusC

1
চার্টারের সেটটি utf8 এ সেট করা আমার ডেটাটাইপটিকে টেক্সট থেকে মিডিয়ামটেক্সটে পরিবর্তন করে। এটা আশা করা হয়?
জেরি

1
@ জেরি সম্ভবত, যেহেতু: "যদি কলামটি ইউটিএফ 8 তে রূপান্তরিত হয় তবে প্রতিটি অক্ষরের পক্ষে সর্বোচ্চ 3 × 65,535 = 196,605 বাইট দৈর্ঘ্যের জন্য তিন বাইটের প্রয়োজন হতে পারে That সেই দৈর্ঘ্যটি কোনও টেক্সট কলামের দৈর্ঘ্য বাইটের সাথে খাপ খায় না, তাই মাইএসকিউএল ডেটা টাইপকে মিডিয়ামটেক্সটে রূপান্তর করে, যা সর্বনিম্ন স্ট্রিং প্রকার, যার জন্য দৈর্ঘ্য বাইটগুলি 196,605 এর মান রেকর্ড করতে পারে Similarly একইভাবে, কোনও ভ্রচার কলামটি মিডিয়ামটেক্সটে রূপান্তরিত হতে পারে "" চরিত্রের সেটটি পরিবর্তন করা হচ্ছে
জব্বাস্ক্রিপ্ট

129
  1. একটি ব্যাকআপ করুন!

  2. তারপরে আপনাকে ডাটাবেসে ডিফল্ট চর সেট সেট করতে হবে। এটি বিদ্যমান সারণীগুলিতে রূপান্তর করে না, এটি কেবল নতুন তৈরি করা টেবিলগুলির জন্য ডিফল্ট সেট করে।

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. তারপরে, আপনাকে সমস্ত বিদ্যমান সারণী এবং তাদের কলামগুলিতে চর সেট রূপান্তর করতে হবে। এটি ধরে নিয়েছে যে আপনার বর্তমান তথ্যটি আসলে বর্তমান চর সেটটিতে রয়েছে in যদি আপনার কলামগুলি একটি চর সেট সেট করা থাকে তবে আপনার ডেটা সত্যিই অন্যটিতে সংরক্ষণ করা হয় তবে কীভাবে এটি পরিচালনা করতে হবে আপনার মাইএসকিউএল ম্যানুয়াল পরীক্ষা করতে হবে ।

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
দ্রষ্টব্য: টেবিলের টেবিলের নাম অক্ষর সেট utf8 কেবলমাত্র তৈরি হওয়া কলামগুলির জন্য ব্যবহৃত টেবিলটিতে ডিফল্ট চর সেট করে। এটি ইতিমধ্যে একটি চর সেট সেট বিদ্যমান কলামগুলিতে রূপান্তর করে না।
সংবাদপত্র

আমার প্রথমে ব্যাকআপ ব্যাকআপ ব্যাকআপটি পড়া উচিত ছিল ... তবে আমার ভাগ্য ছিল এটি বিকাশের পরিবেশে ছিল। সুতরাং আমার উক্তি আপনার কাছে যায়!
ডোমিনিক অ্যাঞ্জেরার

4
@ ডোমিনিকএঞ্জারার: ​​কী ভেঙে গেল?
সিক

16
নোট করুন যে utf8_general_ciআর সেরা অভ্যাস সুপারিশ করা হয় না। মাইএসকিউএল 5.5.3 যেহেতু আপনার utf8mb4পরিবর্তে ব্যবহার করা উচিত utf8। তারা উভয়ই ইউটিএফ -8 এনকোডিংয়ের কথা উল্লেখ করে তবে পুরনোদের utf8উপরে উপরে বর্ণিত অক্ষরের ব্যবহার রোধ করতে একটি মাইএসকিউএল-নির্দিষ্ট সীমাবদ্ধতা ছিল 0xFFFD
u01jmg3

76

কমান্ডলাইন শেল

আপনি যদি একটি কমান্ডলাইন শেল হন তবে আপনি এটি খুব দ্রুত করতে পারেন। কেবল "ডিবি নাম" পূরণ করুন: ডি

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

সাধারণ অনুলিপি / পেস্টের জন্য ওয়ান-লাইনার

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2
আপনি কী পেতে পারেন সে সম্পর্কে আপনি আরও বিশদ রাখতে পারেনERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
স্টেরোস

@ 4485670 আপনাকে কমান্ড লাইনের শেলটিতে এটি চালানো দরকার । আপনার যদি কেবল মাইএসকিউএল ক্লায়েন্ট সংযোগ উপলব্ধ থাকে তবে নীচের এসডিফোরের কোডটি ব্যবহার করুন।
আর্নল্ড ড্যানিয়েল

6
এই কোডটি দুর্দান্ত কাজ করে, প্রয়োজন অনুসারে মাইএসকিএলের পরে -h [হোস্টনেম] -ইউ [ইউজারনেম] -পি [পাসওয়ার্ড] যুক্ত করতে ভুলবেন না।
ছড়িয়ে দিন

3
আপনি সম্ভবত কোনও আসল সিস্টেমে বিদেশী কী চেকগুলি অক্ষম করতে চাইবেন: DB="db_name"; ( echo 'ALTER DATABASE '"$ ডিবি"' `চরিত্র সেট utf8 কল করুন utf8_general_ci; '; mysql --uuser -ppassword -host "$ DB" -e "TABLES দেখান" - ব্যাচ --স্কিপ-কলাম-নাম | xargs -I {} প্রতিধ্বনি 'SET বিদেশী_কি_চেকস = 0; '{}'চরিত্র নির্ধারণের জন্য টেবিল কনভার্টের পরিবর্তে utf8 ক্লিক করুন utf8_general_ci; ' ) | mysql -uuser -ppassword -host "$ DB" `
অ্যাডাম নেলসন

1
যতক্ষণ না আমি "সম্পূর্ণ টেবিলগুলি প্রদর্শন করি যেখানে টেবিলে টাইপ করুন =" টেবিলগুলি দেখান "এর পরিবর্তে 'বেস টেবিল' ব্যবহার করুন
ব্রায়ান পিটারসন

68

আপনি এর সাথে সমস্ত সারণী আপডেট করার জন্য বেকার তৈরি করতে পারেন:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

আউটপুট ক্যাপচার এবং এটি চালান।

উপরের আর্নল্ড ড্যানিয়েলসের উত্তরটি আরও মার্জিত।


আপনি কেন দুটি দুটি টেবিল ক্যোয়ারী যুক্ত করেছেন? এক কি যথেষ্ট নয়?
অক্ষয়

7
আকাশ, ভালো প্রশ্ন প্রথম অল্টার-সারণী ক্যোয়ারী নতুন কলামগুলির জন্য ডিফল্ট সেট করে এবং দ্বিতীয় পরিবর্তক-সারণী ক্যোয়ারী বিদ্যমান কলামগুলিকে রূপান্তর করে।
আনলিমিটেড

4
এফওয়াইআই: dev.mysql.com/doc/refman/5.5/en/alter-table.html মাইএসকিউএল ডকুমেন্টেশন অনুসারে , ALTER স্টেটমেন্টের " কনভার্ট টু চরিত্র সেট" সংস্করণ এক ধাপে উভয়ই করে: "টেবিলের ডিফল্ট পরিবর্তন করতে অক্ষর সেট এবং সমস্ত অক্ষর কলাম (CHAR, VARCHAR,
পাঠ

2
আমার এই ত্রুটি রয়েছে # 1054 - অজানা কলাম 'ওয়েবডিব_প্লেগ্রাউন্ড' যেখানে 'ক্লজ' তবে তবে আমি নিশ্চিত যে আমার
ডিবিটি

1
@ ইয়্যানিসড্রান আপনার ডিবি নামটি হয়ত স্ট্রিং এ না থাকতে পারে, যা WHERE TABLE_SCHEMA=webdb_playgroundআপনাকে অজানা কলামে ত্রুটি দিয়েছে কিন্তু WHERE TABLE_SCHEMA="webdb_playground"সফল হতে পারে। এর মধ্যে অন্য কেউ চালিত হওয়ার ক্ষেত্রে চেষ্টা করার কিছু।
jabbascript

17

এগিয়ে যাওয়ার আগে, নিশ্চিত হয়ে নিন যে আপনি: একটি সম্পূর্ণ ডাটাবেস ব্যাকআপ সম্পন্ন করেছেন!

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

  • আপনার ডাটাবেসের কোলেশন এবং ক্যারেক্টার সেট সনাক্ত করা

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • ডাটাবেসের জন্য কোলেশন ঠিক করা

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

পদক্ষেপ 2: টেবিল স্তর পরিবর্তন

  • ভুল অক্ষর সেট বা কোলেশন সহ ডেটাবেস টেবিলগুলি সনাক্ত করা

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • সারণী কলামগুলির সমষ্টি এবং অক্ষর সেট সামঞ্জস্য করা হচ্ছে

উচ্চ স্কয়ার আউটপুট ক্যাপচার এবং এটি চালান। (অনুসরণ মত)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

উল্লেখ করুন: https://confluence.atlassian.com/display/CONFKB/How+to++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


1
বর্তমানে এই স্ক্রিপ্টটি ডিবি'র জন্য 'utf8_unicode_ci' ব্যবহার করে তবে টেবিলগুলির জন্য 'utf8_general_ci' - তা কি উদ্দেশ্যমূলক ছিল? (আমার মনে হয় উভয়ের একই
চরসেট

stackoverflow.com/questions/10957238/… এখানে একটি পূর্ণ উত্তর রেখে গেছে
ভিএইচ

8

হেইডিএসকিউএল ব্যবহার করুন । এটি বিনামূল্যে এবং একটি খুব ভাল ডিবি সরঞ্জাম।

সরঞ্জাম মেনু থেকে, বাল্ক টেবিল সম্পাদক প্রবেশ করান

সম্পূর্ণ ডাটাবেস নির্বাচন করুন বা রূপান্তর করতে সারণী চয়ন করুন,

  • ডিফল্ট পরিবর্তনটি পরিবর্তন করুন: utf8mb4_general_ci এ টিক দিন
  • চরসেটে রূপান্তর করুন: utf8

এক্সিকিউট

এটি কয়েক সেকেন্ডের মধ্যে সম্পূর্ণ ডাটাবেসটি ল্যাটিন থেকে utf8 তে রূপান্তর করে।

একটি যাদুমন্ত্র মত কাজ করে :)

HeidiSQL ডিফল্টরূপে utf8 হিসাবে সংযোগ করে তাই কোনও বিশেষ অক্ষরকে এখন অক্ষরের (æ ø å) হিসাবে দেখা উচিত এবং টেবিলের ডেটা পরিদর্শন করার সময় এনকোডের মতো নয়।

ল্যাটিন থেকে utf8 এ যাওয়ার সময় আসল ক্ষতি হ'ল পিডো utf8 চরসেটের সাথে সংযোগ স্থাপন করে তা নিশ্চিত করা। যদি তা না হয় তবে আপনি আপনার ওয়েব পৃষ্ঠার সমস্ত জায়গায় utf8 টেবিলটিতে জঞ্জাল ডেটা inোকানো এবং প্রশ্ন চিহ্ন পাবেন, যাতে আপনি ভাবেন যে টেবিলের ডেটাটি utf8 নয় ...


আপনি দয়া করে বিস্তারিত বলতে পারেন? আমার ঠিক এই সমস্যাটি রয়েছে - বিশেষ অক্ষর এবং স্পেসগুলি প্রশ্ন চিহ্ন হিসাবে উপস্থিত হয়। আমি পিএইচপিএমইএডমিন ব্যবহার করে এমএএমপিতে ডাটাবেস রূপান্তর করার চেষ্টা করছি। অফলাইন বিকাশ করার পরে আমি আবিষ্কার করেছি যে আমার হোস্ট utf8mb4 সমর্থন করে না। আমার উইন্ডোজ নেই তাই হেইডিএসকিউএল ব্যবহার করতে পারবেন না। আমি পিএইচপিএমইএডমিন দিয়ে এটি অর্জন করার উপায় আছে কি?
রেক্সটরান্ট

এই মত। বিশেষত আপনি টেবিল প্রচুর আছে।
tyan

CHARSET রূপান্তর করার চেষ্টা করার সময় আমি ত্রুটি পেয়েছি: এসকিউএল ত্রুটি (1025): নাম পরিবর্তন করার সময় ত্রুটি ... তবে এটি একটি আশ্চর্যজনক এসকিউএল পরিচালকের সরঞ্জাম!
মার্কোলোপস

যদি কারও হাইডিস্কেল এর জন্য একটি ভাল ওভারভিউ এবং টিউটোরিয়াল প্রয়োজন হয়, এই নিবন্ধটি দেখুন
ডগবি

6

@ এসডফো মন্তব্য দ্বারা অনুপ্রাণিত, এখানে একটি বাশ স্ক্রিপ্ট রয়েছে যা কাজ করে

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit

4

যদি ডেটা একই চরিত্রের সেট না হয় তবে আপনি এই স্নিপেটটি http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html থেকে বিবেচনা করতে পারেন

যদি কলামটিতে একটি ননবাইনারি ডেটা টাইপ থাকে (CHAR, VARCHAR, TEXT), এর বিষয়বস্তু কলামের অক্ষর সেটটিতে এনকোড করা উচিত, অন্য কোনও অক্ষর সেট নয়। যদি বিষয়বস্তুগুলি একটি ভিন্ন চরিত্রের সেটটিতে এনকোড করা থাকে তবে আপনি প্রথমে বাইনারি ডেটা টাইপ ব্যবহার করতে কলামটি রূপান্তর করতে পারেন এবং তারপরে পছন্দসই অক্ষর সেট সহ একটি ননবাইনারি কলামে রূপান্তর করতে পারেন।

এখানে একটি উদাহরণ:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

সঠিক কোলেশন চয়ন করার বিষয়টি নিশ্চিত করুন, অথবা আপনি অনন্য কী বিবাদ পেতে পারেন। উদাহরণস্বরূপ ইলিয়েনোর এবং এলিয়েনোর কিছু জোটে একই হিসাবে বিবেচিত হতে পারে।

একপাশে:

আমার একটি পরিস্থিতি ছিল যেখানে নির্দিষ্ট অক্ষরগুলি ইমেলগুলিতে "ব্রেক" হয়েছিল যদিও সেগুলি ডাটাবেসে ইউটিএফ -8 হিসাবে সঞ্চিত ছিল। আপনি যদি utf8 ডেটা ব্যবহার করে ইমেল প্রেরণ করছেন তবে আপনি নিজের ইমেলগুলি ইউটিএফ 8-তে পাঠাতে রূপান্তর করতেও পারেন।

পিএইচপিমেইলারে, কেবল এই লাইনটি আপডেট করুন: public $CharSet = 'utf-8';


4

ডাটাবেসের জন্য যে সংখ্যক টেবিল রয়েছে তাদের জন্য আপনি নিম্নোক্ত ব্যবহার করে ডাটাবেসের অক্ষর এবং সমস্ত টেবিল আপডেট করতে একটি সাধারণ পিএইচপি স্ক্রিপ্ট ব্যবহার করতে পারেন:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

আমরা এই স্ক্রিপ্টটি কোথা থেকে চালাব?
ইয়ানিস ড্রান

1
@ ইয়ানিসনড্রান যতক্ষণ না আপনার আইপি দ্বারা এটি কার্যকর করা যায় ততক্ষণ ডাটাবেসে অ্যাক্সেস থাকা উচিত নয়। আপনি প্রথমে ব্যাকআপ নেওয়ার বিষয়টি নিশ্চিত করুন!
ড্যান লুকাস

ভাল, এবং আমরা কীভাবে এটি চালাব? আমাদের কি এটি সার্ভারে আপলোড করতে হবে এবং তারপথে তার অবস্থানের পথে প্রবেশ করতে হবে?
ইয়ান্নিস ড্রান

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

ধন্যবাদ, এটি কয়েকটি উত্তরগুলির মধ্যে একটি যা আসলে এটি দেখায় যে এটি কীভাবে পুরো ডাটাবেসটিতে করা যায় (অর্থাত প্রতিটি টেবিল)। কবজির মতো কাজ করেছেন।
মাচিসুজি

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

সবচেয়ে নিরাপদ উপায় হ'ল কলামগুলিকে প্রথমে বাইনারি টাইপে সংশোধন করা এবং তারপরে পছন্দসই চরসেট ব্যবহার করে এটিতে আবার পরিবর্তন করুন ify

প্রতিটি কলামের টাইপের স্বতন্ত্র বাইনারি টাইপ রয়েছে:

  1. চর => বিনারি
  2. পাঠ্য => ব্লগ
  3. TINYTEXT => TINYBLOB
  4. মিডিয়ামটেক্সট => মিডিয়ামব্লব
  5. লম্বটেক্সট => লংব্লব
  6. VARCHAR => VARBINARY

যেমন .:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

আমি বেশ কয়েকটি লাতিন 1 টেবিলগুলিতে চেষ্টা করেছি এবং এটি সমস্ত ডায়াক্রিটিক্সকে রেখে দিয়েছে।

এটি করে সমস্ত কলামের জন্য আপনি এই ক্যোয়ারীটি বের করতে পারেন:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

আপনার সমস্ত কলামে এটি করার পরে আপনি এটি সমস্ত টেবিলগুলিতে করুন:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

আপনার সমস্ত টেবিলের জন্য এই কোয়েরিটি তৈরি করতে, নিম্নলিখিত কোয়েরিটি ব্যবহার করুন:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

এবং এখন আপনি আপনার সমস্ত কলাম এবং টেবিলগুলি সংশোধন করেছেন, ডাটাবেসে একই করুন:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

1

আপনি যদি আপনার টেবিলগুলিকে রূপান্তর করতে না পান বা আপনার টেবিলটি সর্বদা কিছু অ-ইউটিএফ 8 অক্ষর সেটকে সেট করা থাকে তবে আপনি utf8 চান, আপনার সেরা বাজি এটি মুছে ফেলা এবং আবার শুরু করা এবং স্পষ্টভাবে উল্লেখ করা উচিত:

create database database_name character set utf8;

0

একমাত্র সমাধান যা আমার পক্ষে কাজ করেছিল: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

সারণীযুক্ত একটি ডাটাবেস রূপান্তর করা

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

টেবিলের নাম টেবিলের নাম পরিবর্তন করুন = 'utf8';

এটি একটি সাধারণ ক্যোয়ারী যা আমি আমার ক্ষেত্রে ব্যবহার করতে সক্ষম হয়েছি, আপনি নিজের প্রয়োজন অনুসারে টেবিলের নামটি পরিবর্তন করতে পারেন।


সাধারণত আপনি যা করতে চান তার কোনও ব্যাখ্যা সহ একটি উত্তরের সাথে উত্তর দেওয়া উচিত।
রিগসফলি

0

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

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

আপনি নাবিকেট ডিবিও ডিবি করতে পারেন যা এটি আরও সহজ করে।

  • শিব।

আপনার ডেটাবেসটিতে ডান ক্লিক করুন এবং ড্রপ ডাউনে আপনার পছন্দ অনুযায়ী ডিবি বৈশিষ্ট্য এবং পরিবর্তন নির্বাচন করুন

এখানে চিত্র বর্ণনা লিখুন


0

কমান্ড লাইন সমাধান এবং দৃশ্যগুলি বাদ দিন

আমি সহজেই @ জেসির উত্তরটি অন্যদের মতো @Brianএবং আমার ডেটাবেজে দেখার মতামতগুলির জন্য সম্পূর্ণ করছি।

আপনার যদি এর মতো ত্রুটি থাকে:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

এটি সম্ভবত আপনার দৃষ্টিভঙ্গি রয়েছে এবং সেগুলি আপনাকে বাদ দিতে হবে because কিন্তু সেগুলি বাদ দেওয়ার চেষ্টা করার সময়, মাইএসকিউএল 1 এর পরিবর্তে 2 টি কলাম দেয়।

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

সুতরাং আমাদের awkকেবলমাত্র 1 ম কলামটি টেবিলের নামটি বের করতে জেসির কমান্ডটি মানিয়ে নিতে হবে ।

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

সাধারণ অনুলিপি / পেস্টের জন্য ওয়ান-লাইনার

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

অক্ষর সেট এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করতে পিএইচপিএমইএডমিনে সরল পদক্ষেপগুলি অনুসরণ করুন

  1. আপনার ডাটাবেস নির্বাচন করুন এস এস

  2. অপারেশনে যান এস এস

  3. ক্রিয়াকলাপ ট্যাবে, নীচে কলেশনের ড্রপ ডাউন মেনুতে, আপনি এনকোডিংয়ের ইচ্ছা (যেমন utf8_general_ci) নির্বাচন করুন, এবং চেকবক্সটি পরীক্ষা করুন (1) সমস্ত টেবিলের সমাহার পরিবর্তন করুন, (2) সমস্ত টেবিলের কলামের পরিবর্তন করুন। এবং গো আঘাত করুন।

এস এস

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