
30-07-2009, 22:52
|
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
השאילתא SET NAMES אמורה להמיר קידוד של מידע יוצא ונכנס מהמסד בהתאם לקידוד שהגדרת בה.
לפי מה שציינת, ולפי הנתונים, אז המצב הוא כזה:
המידע שמגיע מהלקוח מקודד ב-UTF-8.
המידע שבמסד מקודד ב-latin1, שזה למעשה ANSI cp1252 (ראה כאן ). בקיצור זה לטינית ולא מה שאתה צריך.
לפי הכתוב בדוקו' של MySQL על קידודים, אך בניגוד להיגיון, המסד כנראה המיר את המידע הנכנס מ-utf8 ל- latin1.
זה בניגוד להיגיון, כיוון שה- system variables מכילים את המידע הבא, כפי שציינת:
קוד:
character_set_client latin1
character_set_connection latin1
character_set_database latin1
character_set_results latin1
character_set_server latin1
character_set_system utf8
collation_connection latin1_swedish_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci
מה שאומר שהמסד נתונים מתייחס לכל המידע הנכנס והיוצא בתור latin1. משמע שהוא לא צריך לבצע המרה של המידע, כי המידע שהוא מקבל מ-PHP הוא מחשיב אותו בתור latin1, וכן המידע שבפנים...
קצת מוזר...
בנוגע ל-webadmin, אני לא מכיר את האפליקציה הזאת ולא מתכוון להכיר. אני לא מסתמך על אפליקציות אחרות כשאני עושה בדיקות.
תראה מה תעשה:
במסמכי ה-HTML שהגדרת להם קידוד utf-8, תדפיס את המידע שהמשתמש הכניס בטופס, ושורה מתחת למידע הזה תדפיס את המידע המקביל אליו (כלומר המידע עם האורך השונה) שב-DB.
ואז תגיד לי איזה מהמידע נראה לך תקין.
המידע התקין הוא המקודד ב-UTF-8. הלא תקין ב-latin1 שהוא כנראה מה-DB.
ושאלה: איך נראית השאילתא שאיתה אתה שולף את המידע? מה נותן לך אינדיקציה לגבי המידע הזה?
האם אתה מנסה לעשות השוואות בין מחרוזות בתוך שאילתת SQL? כאשר מצד אחד זה מחרוזת המתקבלת מהמשתמש, ומצד שני זה המידע שיש בשדה מסוים בטבלה ב-DB.
אגב, האם דרך PHP אתה שולח כותר קידוד? לדוגמא:
קוד PHP:
header('Content-type: text/html; charset=utf-8');
יש לשלוח את הכותר הזה בנוסף לתג meta שהגדרת.
אם תרצה להבין יותר על קידודים ו-collations, תקרא כאן. תפנה לך איזה יום...
עריכה:
דבר אחרון - כאשר אתה רואה שמחרוזת המקודדת ב-UTF-8 גדולה כמעט פי 2 ממחרוזת אחרת, וששני המחרוזות אמורות להיות שוות - סביר להניח שהמחרוזת האחרת מקודדת בקידוד single byte, וסביר להניח שבשתי המחרוזות יש תוי ASCII מלבד תוים שאינם ASCII (כלומר יש תוים משני הקבוצות).
נערך לאחרונה ע"י dorM בתאריך 30-07-2009 בשעה 22:55.
|