PDA

View Full Version : سوال: مشكل با محتواي فارسي در ديتابيس



UnnamE
سه شنبه 21 دی 1389, 04:36 صبح
سلام رفقا
اين سوال ربطي به ديتابيس نداره
مربوط به php ميشه
اوكي ميرم سراغ سوال ام!
من قبلا كه wampp يا mamp يا xampp يا easyphp استفاده ميكردم وقتي محتواي فارسي رو در ديتابيس ذخيره ميكردم، اطالاعات توي ديتابيس ام به همون شكل درست نشون داده ميشد
يعني از لحاظ انكودينگ مشكلي نداشت و مثلا سلام به همون شكل كه در تكست فيلد براي ذخيره مينوشتم در ديتابيس همون سلام نشون داده ميشد!

ولي حالا كه از Zend Server CE استفاده ميكنم و هچنين Apache رو هم جداگانه نصب كردم اطلاعاتي كه خيره ميكنم در ديتابيس به اين شكل نمايش داده ميشه => «Ø±Ø³Ù‚ سÙ
ضد حال نه؟

ولي وقتي بصورت دستي از خود phpmyadmin به ديتابيس insert ميكنم بدون هيچ مشكلي نمايش داده ميشه!
در ضمن واسه خوندن اطلاعات از ديتابيس قبلش از

mysqli_set_charset($this->link, 'utf-8');
استفاده ميكنم تا يه محتوا اينجوري ؟؟؟؟؟؟؟؟ نمايش داده نشه!!!
آها اينم بگم كه Collation ديتابيس رو هم utf8_general_ci قرار دادم
موتور ذخيره سازي هم InnoDB

مغسي بوكو!

eshpilen
سه شنبه 21 دی 1389, 09:11 صبح
ستون مورد نظر شما در جدولی که اطلاعات فارسی توش وارد میشه در جدولی که طراحی کردید، باید از نوع UTF-8 باشه.
بعدش هم بنظرم بهتره mysqli_set_charset($this->link, 'utf-8'); رو بردارید و بجاش یک کوئری با این محتوا رو اجرا کنید:

SET NAMES 'UTF8'
بعد انکدینگ صفحاتی رو هم که در اونها علامت سوال میبینید در مرورگر چک کنید که باید روی UTF-8 باشه و نه چیز دیگه.
یادتون نره موقع درج اطلاعات هم باید قبلش از دستور SET NAMES 'UTF8' استفاده کنید. یعنی هم موقع خوندن و هم موقع نوشتن.
محتویات صفحهء شما هم باید UTF-8 باشه. یعنی انکدینگ صفحه قبل از وارد کردن اطلاعات باید روی UTF-8 باشه. یا اگر محتویات در کد PHP نوشته شدن تا در دیتابیس درج بشن، این محتویات باید انکدینگ UTF-8 داشته باشن.

UnnamE
سه شنبه 21 دی 1389, 17:24 عصر
ايول اشفيلن جان!
قبل از اجراي كويري هاي خودم، كويري كه گفتي اجرا كردم

SET NAMES 'UTF8'
به شكل درست در ديتابيس ذخيره شد!

ghasemweb
چهارشنبه 22 دی 1389, 21:57 عصر
به پاسخ دوستان اضافه ميكنم كه از كد زير هم ميتونيد بهره بگيريد


mysql_query("SET NAMES 'UTF8'");
mysql_query("SET character_set_connection = 'utf8'");

eshpilen
پنج شنبه 23 دی 1389, 09:43 صبح
بعد از SET NAMES نیازی به استفاده از SET character_set_connection نیست.

A SET NAMES 'x' statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Setting each of these character set variables also sets its corresponding collation variable to the default correlation for the character set. For example, setting character_set_connection to x also sets collation_connection to the default collation for x. It is not necessary to set that collation explicitly.


همونطور که میبینید، دستور SET NAMES درواقع سه دستور دیگه رو اجرا میکنه که SET character_set_connection هم جزو اونهاست. بنابراین نیازی نیست ما دوباره دستور SET character_set_connection رو اجرا کنیم.

ضمنا بعضیا ممکنه بعد از دستور SET NAMES از دستور SET CHARACTER SET استفاده بکنن که این اصلا کلا غلط هست و ممکنه مشکلاتی رو بوجود بیاره. چون درواقع دو دستور SET NAMES و SET CHARACTER SET هرکدوم یک جور این تنظیمات رو اعمال میکنن که باعث میشه اثر دستور دیگه تغییر بکنه. اون تنظیماتی هم که تغییری نمیکنن، در هر دو دستور وجود دارن و به یک صورت هستن، پس نیازی نیست ما از هر دو دستور بصورت همزمان استفاده کنیم. فقط از یکیش استفاده کنید. تاجایی که من دیدم، در همه جا SET NAMES دستور درست و کافی هست؛ اگر بعدش اشکالی هم هست اول باید جای دیگه دنبال علتش گشت یا شاید بعلت این بوده که ما قبلا کاراکترهایی رو به روش نادرست وارد دیتابیس کردیم و حالا با اون داده ها مشکل داریم. بهرصورت همیشه فقط یکی از این دو دستور معنا داره، نه دوتاش با هم! چون اونی که بعد میاد اثر دستور قبلی رو خنثی میکنه.


SET CHARACTER SET is similar to SET NAMES but sets character_set_connection and collation_connection to character_set_database and collation_database. A SET CHARACTER SET x statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;

Setting collation_connection also sets character_set_connection to the character set associated with the collation (equivalent to executing SET character_set_connection = @@character_set_database). It is not necessary to set character_set_connection explicitly.


منبع: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

این اشتباهات مدتهاست دارن تکرار میشن و بنده چند بار در چندجا بهشون اشاره کردم.
مثل اینکه باید یه تاپیک در اینمورد بزنم تا این رسم اشتباه ور بیفته!!