পিএইচপি পিডিও: চরসেট, নাম সেট?


188

আমার স্বাভাবিক MySQL_ * সংযোগে এটি আমার আগে ছিল:

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

পিডিওর জন্য কি আমার এটি দরকার? এবং আমার এটি কোথায় পাওয়া উচিত?

$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

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

আপনার যদি চরসেট সমস্যা থাকে তবে আপনার কাছে ইউটিএফ 8 সেট করা ছাড়া আর কোনও উপায় নেই। আমি মনে করি যে নীচে কোবরা_ফাস্ট দ্বারা দেখানো হয়েছে এমনভাবে সংযোগের স্ট্রিংটি ব্যবহার করা উচিত । পিডিও :: আপনার এসকিউএল স্টেটমেন্টগুলি বাউন্ড পরামিতিগুলির সাথে প্রস্তুত করতে প্রস্তুত করুন।
ব্যবহারকারী 12345

1
@ মাসাকিয়েলাস্টিক, তারপরে আমরা কীভাবে "সেট নামগুলি utf8 কল করুন utf8_unicode_ci"
datasn.io

উত্তর:


459

আপনার সংযোগের স্ট্রিংটিতে এটি আপনার মতো থাকবে:

"mysql:host=$host;dbname=$db;charset=utf8"

তবুও, পিএইচপি 5.3.6 এর আগে চরসেট বিকল্পটি উপেক্ষা করা হয়েছিল। আপনি যদি পিএইচপি-র কোনও পুরানো সংস্করণ চালাচ্ছেন তবে আপনার অবশ্যই এটি করা উচিত:

$dbh = new PDO("mysql:$connstr",  $user, $password);
$dbh->exec("set names utf8");

15
এটি লক্ষ্য করার মতো যে এই আচরণটি 5.3.6 এ পরিবর্তিত হয়েছে এবং এখন সঠিকভাবে কাজ করছে।
igorw

15
ইউটিএফ -8 "মাইএসকিএল: হোস্ট = $ হোস্ট; ডিবিনেম = $ ডিবি;
চারসেট

3
আপনি যদি পিএইচপি-র একটি আধুনিক সংস্করণ ব্যবহার করে থাকেন তবে নীচের উত্তরগুলি উপেক্ষা করুন: এটি পিএইচপি 5.3.8 তে ঠিক কাজ করে in
কাসিমির

4
এই ক্ষেত্রে কি আমাকে কোলেশন নির্দিষ্ট করতে হবে? যেমন 'সেট নামস utf8 কল করুন utf8_unicode_ci'?
datasn.io

2
ধন্যবাদ! আমার দিন বাঁচা!
আলেকসান্দ্র

64

পিএইচপি 5.3.6 এর আগে চরসেট বিকল্পটি উপেক্ষা করা হয়েছিল। আপনি যদি পিএইচপি-র কোনও পুরানো সংস্করণ চালাচ্ছেন তবে আপনার অবশ্যই এটি করা উচিত:

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>

1
মোডগুলিতে দ্রষ্টব্য: এটি সঠিক উত্তর এবং গ্রহণযোগ্য উত্তরের এই তথ্যটি সম্পাদনা করার এক বছর আগে এটি পোস্ট করা হয়েছিল।
dotancohen

42

এটি সম্ভবত এটি সবচেয়ে মার্জিত উপায়।
সরাসরি PDO কনস্ট্রাক্টর কল এ, কিন্তু বগি চরসেট বিকল্পটি এড়ানো (উপরে বর্ণিত হিসাবে):

$connect = new PDO(
  "mysql:host=$host;dbname=$db", 
  $user, 
  $pass, 
  array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  )
);

আমার জন্য দুর্দান্ত কাজ করে


1
আমার বোধগম্যতা এটি পিএইচপি 5.3.0 এর জন্যও বগি। যে ক্ষেত্রে আপনি ভালো তার নাম বদলে তার সংখ্যা আখ্যা অ্যারের মধ্যে বিকল্প প্রবেশ করতে হবে: array(1002 => 'SET NAMES utf8',...)
জেডিলেজ

ইঙ্গিতটির জন্য ধন্যবাদ! আমি পিএইচপি এর বিভিন্ন 5.3.X সংস্করণ চলমান একাধিক উত্পাদন সিস্টেমে সফলভাবে উপরের কোডটি ব্যবহার করছি, তবে বাস্তবে এগুলির কোনওটিই 5.3.0 নয়।
জেপসি

4
আমি আমার মতে এটি ডাটাবেস নির্দিষ্ট বিকল্পগুলি ছাড়া আরও মার্জিত হতে পারে
আলেেক্স গবি

সত্য, MYSQL_ATTR_INIT_COMMAND কেবল মাইএসকিউএল ডাটাবেসগুলির জন্য উপলব্ধ (প্রতিটি ডিবি টাইপের জন্য উপলব্ধ কমান্ডের জন্য পিএইচপিএন / ম্যানুয়াল / ডি / পিডো.ড্রাইভার্স.পিপি -র উপ-পৃষ্ঠাগুলি দেখুন )। তবে এটিই ওপি চেয়েছে।
জেপসি

charset=utf8ডিএসএন স্ট্রিংয়ে পাস করার কাজ! আমি সমস্যাগুলি google.google.com/d/msg/auraphp/syMS26Rz-q8/9laQr9tR4EoJ
হরি কেটি

16

সম্পূর্ণতার জন্য, পিডিও থেকে মাইএসকিউএলে কানেক্ট করার সময় এনকোডিংটি সেট করার আসলে তিনটি উপায় রয়েছে এবং কোনটি উপলব্ধ তা আপনার পিএইচপি সংস্করণের উপর নির্ভর করে depend পছন্দের ক্রমটি হ'ল:

  1. charset ডিএসএন স্ট্রিংয়ের প্যারামিটার
  2. সংযোগ বিকল্পটি SET NAMES utf8দিয়ে চালানPDO::MYSQL_ATTR_INIT_COMMAND
  3. SET NAMES utf8ম্যানুয়ালি চালান

এই নমুনা কোডটি তিনটিই প্রয়োগ করে:

<?php

define('DB_HOST', 'localhost');
define('DB_SCHEMA', 'test');
define('DB_USER', 'test');
define('DB_PASSWORD', 'test');
define('DB_ENCODING', 'utf8');


$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);

if( version_compare(PHP_VERSION, '5.3.6', '<') ){
    if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
    }
}else{
    $dsn .= ';charset=' . DB_ENCODING;
}

$conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);

if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
    $sql = 'SET NAMES ' . DB_ENCODING;
    $conn->exec($sql);
}

তিনটিই করা সম্ভবত ওভারকিল (যদি আপনি এমন কোনও ক্লাস না লিখে থাকেন যা আপনি বিতরণ বা পুনরায় ব্যবহার করার পরিকল্পনা করছেন)।


1
ওডিবিসি / অ্যাক্সেস সমতুল্য কি আছে? আমার এখন একটি কার্যকরী ওরাকল এবং মাইএসকিউএল পিএইচপি পিডিও ইউটিএফ 8 সংযোগ রয়েছে তবে আমি এটি ওডিবিসি / অ্যাক্সেসের জন্য কাজ করতে পারি না।
জানুয়ারী

2
ওহ এবং কখনই আপনার ডাটাবেস পাসওয়ার্ড নির্ধারণ করবেন না। তারা সুপারগ্লোবালগুলির মতো বিশ্বব্যাপী এবং আপনি যখন পাসওয়ার্ড নিয়ে কাজ করছেন তখন এটি কোনও ভাল জিনিস নয়।
Xesau

2

আমি কেবল এটি যুক্ত করতে চাই যে আপনি নিশ্চিত করতে হবে যে আপনার ডাটাবেসটি তৈরি হয়েছে utf8_ জেনারাল_সি বা আপনার যে কোনও কোলেশন ব্যবহার করতে চাইলে, অন্যথায় আপনি উদ্দেশ্য ছাড়া অন্য কোনওটি দিয়ে শেষ করতে পারেন।

পিএইচপিএমইডমিনে আপনি আপনার ডাটাবেস ক্লিক করে ক্রিয়াকলাপ দেখতে এবং ক্রিয়াকলাপ চয়ন করতে পারেন। আপনি যদি আপনার ডাটাবেসের তুলনায় অন্য কোলেশন সহ টেবিলগুলি তৈরি করার চেষ্টা করেন, তবে আপনার টেবিলগুলি যাইহোক ডেটাবেস কোলেশন দিয়ে শেষ হবে।

সুতরাং সারণী তৈরির আগে আপনার ডাটাবেসের জন্য কোলেশনটি ঠিক আছে তা নিশ্চিত করুন। আশা করি এটি কারও কয়েক ঘন্টা দীর্ঘ রক্ষা করেছে


1
"আপনি যদি আপনার ডাটাবেসের চেয়ে অন্য কোলেশন দিয়ে টেবিল তৈরি করার চেষ্টা করেন, তবে আপনার টেবিলগুলি যাইহোক ডেটাবেস কোলেশন দিয়ে শেষ হবে" - আমি মনে করি এটি সঠিক নয়। সারণী কোলেশন ডেটাবেস এর কোলেশন চেয়ে অগ্রাধিকার নেয়। dev.mysql.com/doc/refman/5.5/en/charset-table.html
নম্র_ওয়াল্ফ

2

আমি মনে করি আপনার একটি অতিরিক্ত জিজ্ঞাসা দরকার কারণ ডিএসএন-তে চারসেট বিকল্পটি আসলে উপেক্ষা করা হয়েছে। অন্যান্য উত্তরের মন্তব্যে পোস্ট করা লিঙ্কটি দেখুন।

কীভাবে ড্রুপাল 7 এটি করছে http://api.drupal.org/api/drupal/includes--database--mysql--datedia.inc/function/DatediaConnication_mysql%3A%3A__construct/7 এ :

// Force MySQL to use the UTF-8 character set. Also set the collation, if a
// certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
// for UTF-8.
if (!empty($connection_options['collation'])) {
  $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
}
else {
  $this->exec('SET NAMES utf8');
}

1
$conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);

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

1
$con="";
$MODE="";
$dbhost = "localhost";
$dbuser = "root";
$dbpassword = "";
$database = "name";

$con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   

0

আমি এই কোডটি পরীক্ষা করি এবং

$db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
$sql="select * from products  ";
$stmt=$db->prepare($sql);
$stmt->execute();
while($result=$stmt->fetch(PDO::FETCH_ASSOC)){                  
    $id=$result['id'];
}

এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে সে সম্পর্কে অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
রোলস্টুহফলাহার

-1

$ কন = নতুন পিডিও ("মাইএসকিএল: হোস্ট = $ ডিবিস্ট; ডিবিনেম = $ ডাটাবেস; চরসেট = $ এনকোডিং ", "bu ডিবুসার", "$ ডিবিপাশওয়ার্ড");

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