how to display bangla font on mysql database — এখানে আসল সমস্যা ফন্ট নয়, ক্যারেক্টার এনকোডিং। MySQL শুধু লেখার অক্ষর জমা রাখে; সেগুলো কোন ফন্টে দেখাবে তা ঠিক করে ব্রাউজার। ডাটাবেসে বাংলা লিখলে যদি ???? বা ব ধরনের অদ্ভুত চিহ্ন দেখায়, তার মানে ডাটাবেস, টেবিল, PHP কানেকশন বা HTML পেজের অন্তত একটি UTF-8 নয়। চারটি জায়গা একসাথে ঠিক করলেই সমস্যা মিটে যায়।

কেন বাংলা লেখা ???? হয়ে যায়
পুরোনো MySQL-এ ডিফল্ট ক্যারেক্টার সেট ছিল latin1, যা বাংলা অক্ষর রাখতে পারে না। তখন প্রতিটি অক্ষর ? হয়ে সেভ হয়, আর একবার ? হয়ে গেলে সেই ডাটা আর ফেরত আনা যায় না। অন্যদিকে ডাটা ঠিক সেভ হলেও PHP কানেকশন latin1 হলে পড়ার সময় ‘঒ ধরনের জট দেখায়। সমাধান হলো সব জায়গায় utf8mb4 ব্যবহার করা। কেন utf8 নয়, utf8mb4 — তা MySQL-এর অফিসিয়াল utf8mb4 ডকুমেন্টেশনে বলা আছে: এটি পুরো ইউনিকোড (ইমোজিসহ) সমর্থন করে।
how to display bangla font on mysql database: চারটি ধাপ
১. ডাটাবেস ও টেবিল utf8mb4 করুন
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
নতুন টেবিল বানালে CREATE TABLE-এর শেষে DEFAULT CHARSET=utf8mb4 লিখুন। phpMyAdmin ব্যবহার করলে টেবিলের Operations ট্যাবে Collation থেকে utf8mb4_unicode_ci বেছে নিন। কনভার্ট করার আগে অবশ্যই ব্যাকআপ নিন।
২. PHP কানেকশনে charset দিন
// PDO
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4', $user, $pass);
// mysqli
$db = new mysqli('localhost', $user, $pass, 'mydb');
$db->set_charset('utf8mb4');
৩. HTML পেজ UTF-8 করুন
আউটপুট পেজের <head>-এ <meta charset="UTF-8"> দিন এবং PHP ফাইলগুলো UTF-8 (BOM ছাড়া) হিসেবে সেভ করুন। এ বিষয়ে বিস্তারিত আছে HTML-এ বাংলা ফন্ট ব্যবহারের গাইডে।
৪. দেখানোর জন্য একটি বাংলা ওয়েব ফন্ট দিন
এনকোডিং ঠিক হলে লেখা বাংলাতেই আসবে। এরপর সব ডিভাইসে এক চেহারা পেতে CSS-এ Noto Sans Bengali বা Hind Siliguri দিন। ধাপগুলো পাবেন ওয়েবসাইটে বাংলা ফন্ট লেখায়।

when insert bangla font in mysql using php: পরীক্ষার উদাহরণ
সব ঠিক হলো কি না বুঝতে একটি ছোট পরীক্ষা চালান। prepared statement ব্যবহার করলে SQL injection-এর ঝুঁকিও থাকে না:
$stmt = $pdo->prepare('INSERT INTO posts (title) VALUES (?)');
$stmt->execute(['আমার সোনার বাংলা']);
foreach ($pdo->query('SELECT title FROM posts') as $row) {
echo htmlspecialchars($row['title']);
}
পেজে লেখাটি ঠিকমতো এলে এবং phpMyAdmin-এও বাংলা দেখালে পুরো চেইন ঠিক আছে।
লক্ষণ দেখে কারণ ধরুন
| যা দেখছেন | সম্ভাব্য কারণ |
|---|---|
| phpMyAdmin-এও ???? | কলাম latin1; ডাটা আগেই নষ্ট, কলাম বদলে আবার ইনসার্ট করুন |
| phpMyAdmin-এ ঠিক, পেজে জট | PHP কানেকশনে charset নেই |
| পেজে ◆ বা □ চিহ্ন | HTML পেজে meta charset নেই বা ফাইল UTF-8 নয় |
| বাংলার জায়গায় ইংরেজি অক্ষর | বিজয়ে টাইপ করা ANSI লেখা সেভ হয়েছে |
শেষ সমস্যাটি এনকোডিংয়ের নয়, ইনপুটের। বিজয়ের লেখা ডাটাবেসে দেওয়ার আগে ইউনিকোডে কনভার্ট করুন। ইউনিকোড আসলে কী, তা জানতে পড়ুন ইউনিকোড বাংলা ফন্ট কী।

পুরোনো latin1 ডাটা থাকলে সাবধান
অনেক পুরোনো সাইটে বাংলা লেখা latin1 কলামে UTF-8 বাইট হিসেবে জমা থাকে (ডাবল এনকোডিং)। এমন ক্ষেত্রে সরাসরি CONVERT TO চালালে লেখা আরও নষ্ট হতে পারে। নিরাপদ উপায় হলো আগে কলামটি BLOB-এ, তারপর utf8mb4 TEXT-এ রূপান্তর করা, এবং পুরো কাজটি আগে একটি কপি ডাটাবেসে পরীক্ষা করা। এই সাবধানতা মেনে চললে how to display bangla font on mysql database নিয়ে আর ভাবতে হবে না। PDF-এ বাংলা ডাটা দেখাতে চাইলে পড়ুন dompdf-এ বাংলা ফন্ট।
প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
MySQL-এ বাংলা লেখা ???? হয়ে যায় কেন?
কলাম বা কানেকশনের ক্যারেক্টার সেট latin1 হলে বাংলা অক্ষর ? হয়ে সেভ হয়। ডাটাবেস, টেবিল ও PHP কানেকশন সব জায়গায় utf8mb4 ব্যবহার করুন।
utf8 আর utf8mb4-এর মধ্যে কোনটি ব্যবহার করব?
utf8mb4 ব্যবহার করুন। MySQL-এর পুরোনো utf8 আসলে তিন বাইটের সীমিত সংস্করণ; বাংলা চললেও ইমোজি বা কিছু বিশেষ অক্ষর সেভ হয় না।
PHP mysqli-তে বাংলা ইনসার্ট করতে কী লাগে?
কানেকশনের পরপরই set_charset(“utf8mb4”) কল করুন এবং কলামটি utf8mb4 কি না নিশ্চিত হোন। তাহলে বাংলা সঠিকভাবে সেভ ও পড়া যাবে।
আগে সেভ হওয়া ???? লেখা কি ফিরিয়ে আনা যায়?
না। ? হিসেবে সেভ হওয়া অক্ষর স্থায়ীভাবে হারিয়ে যায়। কলাম utf8mb4 করে মূল উৎস থেকে ডাটা আবার ইনসার্ট করতে হবে।
ডাটাবেসে কি ফন্ট সেট করা যায়?
না, ডাটাবেস শুধু অক্ষর জমা রাখে। ফন্ট ঠিক করা হয় ওয়েব পেজের CSS-এ font-family দিয়ে।