שלח תשובה

זירת השאלות

6370
צפיות
6
תשובות

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

,‏ 17 במרץ, 2012

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

מסד הנתונים שלי מכיל טבלה עם ארבעה טורים שלאחד מהם קוראים 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’");
האתר מציג סימנים במקום טקסט ברור.

6 תשובות

  1. אני לא מכיר mysql בצורה טובה, אולי מישהו אחר יוכל לסייע…

    בכל מקרה אני ממליץ להציץ על המאמרים האלה, אולי באחד מהם טמון הפתרון
    https://webmaster.org.il/?t=%D7%A2%D7%91%D7%A8%D7%99%D7%AA

  2. roygolan הגיב:

    היתה לי בעיה דומה עם
    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 את תוכן הטבלאות, ואז לייבא אותו לתוך טבלאות חדשות שתגדיר ידנית)

  3. roygolan הגיב:

    השאלה איפה בדיוק הבעיה. האם במיגע שמגיע לקובץ הPHP, בקובץ הPHP עצמו, או במאגר, בלי קשר לPHP? מה שהבנתי משאלתך זה שאתה מחפש אך להמיר את הקידוד חזרה לעברית בקובץ הPHP לפני השליחה למאגר – זה נעשה כך – (העתק ויישר לשמאל כדי לראות את זה כמו שצריך):

    $decoded = urldecode($encoded)

  4. roygolan הגיב:

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

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

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

    בלי
    mysql_query("SET CHARACTER SET ‘hebrew’");

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

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

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

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

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

  5. srkz הגיב:

    Webmaster הציג לא נכון את הג’יבריש, זה אמור להיות האותיות e ו-a עם קווים עליהן.
    + אני לא רואה את התשובה האחרונה שלך.

  6. roygolan הגיב:

    האם בלי השורה … SET CHARACTER SET העברית מוכנסת למאגר כמו שצריך?

שלח תשובה