PDA

View Full Version : اشتباهات متداول در ارتباط با کاراکترهای فارسی در دیتابیس (دستور SET NAMES 'UTF8')



eshpilen
پنج شنبه 23 دی 1389, 10:01 صبح
بعد از 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

این اشتباهات مدتهاست دارن تکرار میشن و بنده چند بار در چندجا بهشون اشاره کردم.

sattaryekta
دوشنبه 11 بهمن 1389, 12:50 عصر
مهمترین نکته این بود:
بعد از:
SET NAMES
از
SET CHARACTER SET
استفاده نکنید!

hamed-php
چهارشنبه 13 بهمن 1389, 13:26 عصر
سلام
من تو table دیتابیسم که فارسی insert میکنم و بعد browse میکنم فارسی نوشته شده ولی بعد که میرم تو سایت php میبینم همون رکورد با ???? نشون داده شده. و از طرف دیگه تو سایتم که input میکنم یه عبارت فارسی رو اونجا فارسی نمایش داده میشه اما تو دیتابیس و تو table بصورت فیلم نمایش داده میشه.

علت چیه؟
از utf-persian-ci هم استفاده کردم همه جا

eshpilen
چهارشنبه 13 بهمن 1389, 17:49 عصر
من تو table دیتابیسم که فارسی insert میکنم
منظورتون از طریق PHPMyAdmin هست؟


و از طرف دیگه تو سایتم
سایت شما با چه نرم افزاری ساخته شده؟ خودتون نوشتید؟

hamed-php
پنج شنبه 14 بهمن 1389, 12:33 عصر
بلی - منظورم از table همون PHPmyadmin هست. و منظورم از سایت همون صفحات PHP هست که از طریق اون insert میکنم کویری ها رو به db mysql

eshpilen
پنج شنبه 14 بهمن 1389, 18:46 عصر
قبل از کوئری های insert خودتون از دستور SET NAMES 'utf8' استفاده میکنید؟
راستی آدرس صفحه رو بدید.