মাইএসকিউএলে নামগুলি সেট করুন?


110

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

query("SET NAMES utf8");   

এখনও কোনও প্রকল্পের জন্য আমার কখনই এটি করতে হয়নি তাই আমার এটি সম্পর্কে কয়েকটি প্রাথমিক প্রশ্ন রয়েছে।

  1. এটি কি কেবল পিডিও দিয়ে করা হয়?
  2. এটি যদি পিডিও নির্দিষ্ট জিনিস না হয়, তবে এটি করার উদ্দেশ্য কী? আমি বুঝতে পারি এটি মাইএসকিএল-এর জন্য এনকোডিং সেট করছে তবে আমার অর্থ, এটি কখনই ব্যবহার করতে হয়নি তাই আমি কেন এটি ব্যবহার করতে চাই?

4
এসকিউএল ইনজেকশনের কারণে "সেট নামগুলি utf8" এড়ানো উচিত। বিশদ জানতে php.net/manual/en/mysqlinfo.concepts.charset.php দেখুন।
মাসাকিয়েলেস্টিক

3
@ মাসাকিয়েলাস্টিক আমি দেখছি না যেখানে 'সেট নামগুলি ইউটিএফ 8' সেট করা স্কিল ইঞ্জেকশনের জন্য হুমকি? যথাযথ মাইএসকিউএল এপিআই ব্যবহার করে থ্রেডটি কোথায়?
ব্রডব্যান্ড

3
আমার নির্দয়তার জন্য দুঃখিত Ircmaxell এর উত্তর দেখুন: stackoverflow.com/a/12118602/531320 Althogh "তে সেট NAMES এর" ব্যবহার হল UTF-8, ভবিষ্যতে সম্ভাবনা আপনি ব্যবহার করবে GBK বা Big5 (চীনা) অথবা Shift_JIS (জাপানি) অনস্বীকার্য যতদিন কোনো সমস্যা হয় না ।
masakielastic

উত্তর:


74

'Ñ' বা 'ö' এর মতো খাঁটি ASCII তে প্রতিনিধিত্ব করা যায় না এমন অক্ষরযুক্ত সার্ভারে যখনই আপনি ডেটা প্রেরণ করতে চান তখনই এটি প্রয়োজন হয়।

এটি যদি মাইএসকিউএল উদাহরণটি ক্লায়েন্ট সংযোগগুলি থেকে ডিফল্টরূপে ইউটিএফ -8 এনকোডিংয়ের জন্য কনফিগার করা না হয় (অনেকগুলি আপনার অবস্থান এবং প্ল্যাটফর্মের উপর নির্ভর করে)

আপনি ইউনিকোড কীভাবে কাজ করে তা অবগত না হলে http://www.joelonsoftware.com/articles/Unicode.html পড়ুন ।

SET NAMES বিকল্পগুলি দেখতে এবং এটি সম্পর্কে ঠিক কী আছে তা দেখতে "SET NAMES" ব্যবহার করবেন কিনা তা পড়ুন ।


3
'ö' এবং 'ñ' এএসসিআইআই প্রসারিত। আপনি SET NAMES UTF8তাদের জন্য এখনও প্রয়োজন ?
টিম

2
আমি দেখতে পেয়েছি যে আমাকে প্রায়শই utf8_decode ($ my_text) যোগ করতে হয়; পিএইচপি তে যখন ডেটা মাইএসকিউএল থেকে অনুসন্ধান করা হয়েছিল তখন সঠিকভাবে ওয়েবসাইটগুলিতে দেখাতে বিশেষ ইউটিএফ -8 অক্ষর পেতে। আমার সারণী এবং কলামগুলি মাইএসকিউএল-তে ইউটিএফ -8 এ সেট করা আছে — সুতরাং এটির কি দরকার?
NexusRex

1
@ ভিঙ্কো ভার্সালভিক: অগত্যা নয় ... আমার সমস্ত ফাইল ইউটিএফ 8 এ ছিল তবে আমার পূর্ববর্তী হোস্টারের মাইএসকিএল চারসেটটি লাতিন 1 তে সেট করা আছে এবং কারণ আমি মাইএসকিএলকে বলেছি যে আমি ইউটিএফ 8 তে অক্ষর প্রেরণ করছি (সুতরাং নামগুলি utf8 সেট করে) এটি সেগুলি সংরক্ষণ করে লাতিন চরসেটে এবং আমার সমস্ত বিশেষ অক্ষরে (স্লোভেনিয়ান čšž) দেখে মনে হয়েছিল যেন তারা গাড়িতে চাপিয়ে ফেলেছিল - আর একটি বিষয়: আপনি যখন phpmyadmin এ অনুসন্ধান করেন আপনি ফলাফল পাবেন না, কারণ একটি č এর মতো Å এবং আরও
এরিক Čerpnjak

মনে রাখবেন যে এটি ক্লায়েন্টকে ফলাফল ফেরত প্রেরণের জন্য সার্ভারের যে অক্ষর সেটটি ব্যবহার করা উচিত তাও নির্দিষ্ট করে, উদাহরণস্বরূপ একটি SELECTবিবৃতি ব্যবহার করে এই ডেটা প্রাপ্ত করার সময় এটিরও প্রয়োজন হয় ।
লিওপল্ডো সান্জিক

@Tim। "বর্ধিত এএসসিআইআই" এর মতো সত্যিকারের কোনও জিনিস নেই। বিভিন্ন এনকোডিংয়ের পুরো গোছা রয়েছে যা সবাইকে বর্ধিত ASCII বলা যেতে পারে (যে কোনও একক বাইট অক্ষর সেট যেখানে প্রথমার্ধটি ASCII এর সমান এবং সেখানে প্রচুর পরিমাণে লোড রয়েছে)।
ট্রিগ

43

ম্যানুয়াল থেকে :

সার্ভারে এসকিউএল স্টেটমেন্টগুলি প্রেরণ করতে ক্লায়েন্ট কী অক্ষর সেট করবে সেটি সেট করে নাম নির্ধারণ করে।

আরও বিশদভাবে, (এবং আবারও কৃতজ্ঞভাবে ম্যানুয়ালটি থেকে সরানো ):

সার্ভারে এসকিউএল স্টেটমেন্টগুলি প্রেরণ করতে ক্লায়েন্ট কী অক্ষর সেট করবে সেটি সেট করে নাম নির্ধারণ করে। সুতরাং, সেট নামস 'সিপি 1251' সার্ভারকে বলে, "এই ক্লায়েন্টের ভবিষ্যতের আগত বার্তাগুলি অক্ষর সেট সিপি 1251 এ রয়েছে।" এটি ক্লায়েন্টকে ফলাফল ফেরত প্রেরণের জন্য সার্ভারটি ব্যবহার করা উচিত এমন অক্ষর সেটটিও নির্দিষ্ট করে। (উদাহরণস্বরূপ, এটি যদি আপনি একটি নির্বাচন বিবৃতি ব্যবহার করেন তবে কলামের মানগুলির জন্য কোন অক্ষরটি সেট করতে হবে তা নির্দেশ করে))


6
আমি তোমায় ভালোবাসি. সবেমাত্র আমার সন্ধ্যা!
karim79

34

ডানদিকে এনকোডিং পাওয়া সত্যিই জটিল - এখানে অনেকগুলি স্তর রয়েছে:

  • ব্রাউজার
  • পৃষ্ঠা
  • পিএইচপি
  • মাইএসকিউএল

পিএইচপি থেকে এসকিউএল "SET CHARSET utf8" কমান্ড নিশ্চিত করবে যে ক্লায়েন্ট সাইড (পিএইচপি) ডাটাবেসে কীভাবে সংরক্ষণ করা হয় তা বিবেচনা না করে utf8 তে ডেটা পাবে। অবশ্যই, তাদের প্রথমে সঠিকভাবে সংরক্ষণ করা দরকার।

ডিডিএল সংজ্ঞা বনাম বাস্তব তথ্য

সারণী / কলামের জন্য সংজ্ঞায়িত এনকোডিংয়ের অর্থ এই নয় যে ডেটা সেই এনকোডিংয়ে রয়েছে। আপনি যদি কোনও টেবিল হিসাবে সংজ্ঞায়িত হয়ে থাকে utf8তবে এটি পৃথক এনকোডিং হিসাবে সঞ্চিত করে থাকেন, তবে মাইএসকিউএল এগুলি তাদের হিসাবে বিবেচনা করবে utf8এবং আপনি সমস্যায় পড়ছেন । যার অর্থ আপনাকে প্রথমে এটি ঠিক করতে হবে।

কী যাচাই করবো

প্রতিটি স্তরে ডেটা প্রবাহকে কী এনকোডিং করছে তা আপনাকে পরীক্ষা করতে হবে।

  • HTTP শিরোনাম, শিরোনাম পরীক্ষা করুন।
  • অনুরোধের শুরুর দিকে কী পাঠানো হয়েছে তা পরীক্ষা করুন।
  • ভুলে যাবেন না যে মাইএসকিউএল প্রায় সর্বত্র এনকোডিং রয়েছে:
    • তথ্যশালা
    • টেবিল
    • কলাম
    • সামগ্রিকভাবে সার্ভার
    • ক্লায়েন্ট
      নিশ্চিত করুন যে সর্বত্র যে সঠিক আছে।

রূপান্তর

আপনি যদি উদাহরণস্বরূপ ডেটা গ্রহণ করেন windows-1250এবং সঞ্চয় করতে চান utf-8, তবে সংরক্ষণের আগে এই এসকিউএল ব্যবহার করুন:

SET NAMES 'cp1250';

আপনার যদি ডিবিতে ডেটা থাকে এবং windows-1250পুনরুদ্ধার করতে চান তবে utf8ব্যবহার করুন:

SET CHARSET 'utf8';

আরও কয়েকটি নোট:

  • ডেটা দেখানোর জন্য খুব বেশি "স্মার্ট" সরঞ্জামগুলির উপর নির্ভর করবেন না। উদাহরণস্বরূপ phpMyAdmin (যখন আমি এটি ব্যবহার করছিলাম তখন করছিল) এনকোডিংটি খুব খারাপ। এবং এটি সমস্ত স্তরগুলির মধ্য দিয়ে যায় তাই এটি খুঁজে পাওয়া শক্ত।
  • এছাড়াও, ইন্টারনেট এক্সপ্লোরারের অদ্ভুত নিয়মের ভিত্তিতে এনকোডিংটি "অনুমান" করার সত্যিই বোকামি আচরণ করেছিল।
  • সাধারণ সম্পাদকগুলি ব্যবহার করুন যেখানে আপনি এনকোডিং স্যুইচ করতে পারেন। আমি মাইএসকিউএল ওয়ার্কবেঞ্চ সুপারিশ করছি।

19

এই কোয়েরিটি কোয়েরির আগে লেখা উচিত যা ডেটাবেসে ডেটা তৈরি করে বা আপডেট করে, এই ক্যোয়ারীটি দেখে মনে হচ্ছে:

mysql_query("set names 'utf8'");

মনে রাখবেন যে শিরোনামে আপনি যে এনকোডটি ব্যবহার করছেন তা লিখতে হবে উদাহরণস্বরূপ আপনি যদি utf-8 ব্যবহার করে থাকেন তবে আপনি এটি এটিকে এটি শিরোনামে যুক্ত করেন বা এটি ইন্টারনেট এক্সপ্লোরারের সমস্যা সমাধান করবে will

সুতরাং আপনার পৃষ্ঠাটি দেখতে এমন দেখাচ্ছে

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
</html>

8
আপনি পিএইচপি mysql লাইব্রেরি ব্যবহার করা উচিত নয় পরিবর্তে আপনি মাইএসকিউএল বা PDO ব্যবহার করা উচিত।
আন্দ্রে ফিগুয়েরা

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

1
শেষ ট্যাগটি </ html> হওয়া উচিত <html> নয়
জিটিএস জো


5

এসকিউএল ক্যোয়ারির মাধ্যমে এটি করার পরিবর্তে পিএইচপি ফাংশনটি ব্যবহার করুন: mysqli :: set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

আরও তথ্যের জন্য মাইএসকিউএল অক্ষর সেট ধারণাগুলি বিভাগটি দেখুন।

http://www.php.net/manual/en/mysqli.set-charset.php থেকে


1

সবাইকে ধন্যবাদ!

ব্যবহার করবেন না: ক্যোয়ারী ("SET NAMES utf8"); এটি সেটআপ স্টাফ এবং কোয়েরি নয়। সেটচারসেট () বা (অনুরূপ পদ্ধতি) দিয়ে সংযোগ শুরু করার ঠিক পরে এটিকে রাখুন

অংশে কিছু ছোট জিনিস:

স্থিতি:

  • ডিফল্টরূপে mysql সার্ভারটি ল্যাটিন 1 এর সাথে কথা বলে
  • আপনার গর্ত অ্যাপটি utf8 এ রয়েছে
  • সংযোগটি কোনও অতিরিক্ত ছাড়াই তৈরি করা হয় (সুতরাং: ল্যাটিন 1) (কোনও সেট নামস utf8 ... নেই, কোনও সেট_চারসেট () পদ্ধতি / ক্রিয়া নেই)

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

এখন পর্যন্ত এই সমস্যা নেই! (ভুল তবে প্রায়শই কাজ করে (ইউরোপে)) ..

..অনেকে অন্য ক্লায়েন্ট / প্রোগ্রাম বা পরিবর্তিত লাইব্রেরি, যা সঠিকভাবে কাজ করে, ডেটা পড়বে / সংরক্ষণ করবে। তাহলে আপনি বড় সমস্যায় পড়েছেন!


0

শুধু পিডিও নয়। যদি এসকিএল উত্তর '????' প্রতীক, আপনার চারসেট প্রিসেট (আশা ইউটিএফ -8) সত্যিই প্রস্তাবিত:

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

বা পদ্ধতি শৈলীর মাধ্যমে mysqli_set_charset($db,"utf8")

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