וובמאסטר - תיכנות ובניית אתרים
שאלות ותשובות:
הוסף תשובה

בעיית עברית ב-mysql

טוב, מדובר בבעיה מעצבנת למדי שאני די בטוח שהיא כבר נשאלה פה בעבר אבל לא מצאתי את פיתרון. ולעניין:

מסד הנתונים שלי מכיל טבלה עם ארבעה טורים שלאחד מהם קוראים name. כל הטורים בטבלה מוגדרים לקידוד utf8_general_ci. בעמוד html שקידודו מוגדר כך:
<meta http-equiv="Content-type" value="text/html; charset=utf-8">
מזין המשתמש כיתוב ל-input. הנתון נשלח לעמוד php שקידודו מוגדר בצורה זהה. (בנוסף, לאחר ההתחברות למסד הנתונים מוגדר:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'hebrew'");

עמוד ה-php צריך להציג את המידע שכתוב בטבלה בשורה בה השם זהה לנתון שהזין המשתמש.

אם המשתמש מזין נתון מספרי או באנגלית שנמצא בטבלה האתר מוצא אותו ומציג מה שצריך. אם המשתמש מזין נתון בעברית שנמצא בטבלה האתר לא מצליח למצוא אותו. אופס!
בדקתי והנתון שנשלח לשרת נשלח בצורה טובה, כלומר שהוא אכן נשלח בעברית ולא עובר מסיבה כלשהי הסבה לסימנים.

מה עלי לעשות כדי לגרום לאתר למצוא גם את הנתונים בעברית?
אציין שאת הנתונים בטבלה הזנתי לפני ששיניתי את הקידוד שלה ל-utf8_general_ci.

כדי למנוע שאלות:
אם אני לא מציין בעמוד ה-php את השורה
mysql_query("SET CHARACTER SET 'hebrew'");
האתר מציג סימנים במקום טקסט ברור.

srkz, 17/3/2012
תגיות: php mysql עברית‏  
הוסף תשובה  |  הוסף הערה
6 תשובות לשאלה זו
הוסף תשובה
אני לא מכיר mysql בצורה טובה, אולי מישהו אחר יוכל לסייע...

בכל מקרה אני ממליץ להציץ על המאמרים האלה, אולי באחד מהם טמון הפתרון
http://webmaster.org.il/?t=%D7%A2%D7%91%D7%A8%D7%99%D7%AA
אלי ענתבי, 18/3/2012
תודה על הקישור אך אף אחד מהמאמרים הללו, גם "עברית עם PHP ו- MySQL", לא סייע לי בפתירת הבעיה. - srkz, 18/3/2012
הוסף תשובה  |  הוסף הערה
היתה לי בעיה דומה עם
http://he.thenamestork.com

מציע:
1. לוודא שלא רק הקידוד של המאגר הכללי שונה, אלא גם הקידוד של כל טבלה.
2. לוודא שמה שנשלח לPHP כן עובר קידוד (javascript: uriencode). אם זה נשלח בGET, ואולי גם בPOST, הטקסט עובר פענוח באופן אוטומטי. טקסט עברי שלא עבר קידוד בשליחה אולי ייראה לך בסדר בכלי הפיתוח, אבל בפועל יגיע מחורבש.
3. נסה לבודד QUERY ספציפי שמשתמש עשוי להכניס, ולבדוק, אולי עם קובץ PHP שיעשה ECHO למה שיתקבל, מה *בדיוק* נשלח לשרת בפקודת הMYSQL. קח את מה שתקבל והכנס את זה ישירות לMYSQL (לדוגמה בPHP MYADMIN), שם יהיה קל יותר להבין מה הבעיה.
4. השורה SET CHARACTER SET היא בעקרון מיותרת. הבנתי שבלעדיה העברית מתחרבשת, אבל אולי זה אומר שהשורה הזו משמשת כאן בפאטץ' לבעיה כלשהי, ואולי אם תזהה ותפתור את הבעיה הזו, הבעיה שהעלית כאן תיפתר.
5. אם שום דבר לא עובד אולי תשקול להעתיק את תוכן המאגר שלך למאגר חדש שיוגדר מראש עם הקידודים הנכונים (אולי לייצא לקבצי EXCEL את תוכן הטבלאות, ואז לייבא אותו לתוך טבלאות חדשות שתגדיר ידנית)
roygolan, 21/3/2012
בעזרת התשובה שלך הצלחתי למצוא שבאמת מה שמגיע לשרת זה לא מה שחשבתי. לצערי לא הצלחתי למצוא איך להכניס את הקידוד, תוכל להראות לי? יש אפשרות לגרום לו להכניס את הנתונים כשהם בעברית ולא כמו %E4 וכדומה? - srkz, 24/3/2012
הוסף תשובה  |  הוסף הערה
השאלה איפה בדיוק הבעיה. האם במיגע שמגיע לקובץ הPHP, בקובץ הPHP עצמו, או במאגר, בלי קשר לPHP? מה שהבנתי משאלתך זה שאתה מחפש אך להמיר את הקידוד חזרה לעברית בקובץ הPHP לפני השליחה למאגר - זה נעשה כך - (העתק ויישר לשמאל כדי לראות את זה כמו שצריך):

$decoded = urldecode($encoded)
roygolan, 25/3/2012
איפה הבעיה? כדי לבדוק אם באמת מגיעים לשרת נתונים בעברית אמרתי ל-sql להכניס את מה שהוא מקבל למאגר. מה שראיתי שהוא הכניס למאגר היה ג'יבריש. אם אני אגיד ל-php לעשות urldecode לנתונים זה לא ישנה אותם, כי הם גם ככה לא עברו קידוד כדוגמת urlencode. - srkz, 25/3/2012
או שה-php לא מצליח לשלוח את הנתונים כמו שצריך או שה-sql עושה להם משהו (כנראה שהראשון). יש רעיון? - srkz, 25/3/2012
הייתי כותב קובץ PHP לבדיקה, עם הגדרות זהות לקובץ שאתה משתמש בו, שמכניס טקסט קבוע כמו 'שלום' למאגר, ומריץ את הקובץ ישירות, כדי להבין טוב יותר מה הבעיה. חוצמזה מה קורה כשאתה מכניס טקסט ישירות למאגר בPHPMYADMIN? - roygolan, 25/3/2012
עשיתי מה שאמרת: כשאני מנסה להכניס נתונים עם phpMyadmin הכל נכנס כראוי. כשאני אומר לעמוד להזין נתון קבוע בטבלה הוא מזין ג'יבריש כמו מקודם. רק כדי להבהיר, המילה "בדיקה" מוזנת כך: ???÷? מה עכשיו? - srkz, 25/3/2012
הוסף תשובה  |  הוסף הערה
כשמכניסים אנגלית דרך הPHP זה עובר בסדר? אם כן, הדבר האחרון שאני יכול לחשוב עליו זה לבדוק שוב קידודים.

לא יודע אם ככה זה צריך להיות, אבל אצלי הקידודים הם
utf8_bin למאגר
utf8_general_ci לכל טבלה

ובקובץ הPHP השורה היחידה שקשורה לקידוד היא
mysqli_query($linkID, "SET NAMES 'utf8'");

בלי
mysql_query("SET CHARACTER SET 'hebrew'");

(אגב וידאת שכל העמודים שלך הם גם בקידוד UTF8?)

ואם כלום לא עובד, לעזוב רגע את האתר, לפתוח מאגר חדש לניסיון וקובץ פשוט שמכניס רק מילה אחת, ולשחק עם ההגדרות עד שתצליח להבין איך זה צריך להיות.

ו/או להתקין את הגרסאות העדכניות ביותר של תוכנות השרת

ו/או לחכות שמישהו מבין יותר יענה פה כאן..

מקווה שמשהו יעזור

roygolan, 26/3/2012
הוסף תשובה  |  הוסף הערה
Webmaster הציג לא נכון את הג'יבריש, זה אמור להיות האותיות e ו-a עם קווים עליהן.
+ אני לא רואה את התשובה האחרונה שלך.
srkz, 26/3/2012
הוסף תשובה  |  הוסף הערה
האם בלי השורה ... SET CHARACTER SET העברית מוכנסת למאגר כמו שצריך?
roygolan, 28/3/2012
הוסף תשובה  |  הוסף הערה
הוסף תשובה לשאלה זו:




וובמאסטר © כל הזכויות שמורות