MySQL и кодирование - PullRequest
       25

MySQL и кодирование

2 голосов
/ 13 мая 2010

Я перенес свое php-приложение на новый сервер. я использую mysql5 дб. Когда я обновляю или вставляю что-то в БД, каждый знак " и - меняется на ?. Я использую SET NAMES UTF8 и SET CHARACTER SET, но это не работает. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

SET NAMES UTF8 следует использовать на каждой странице при выборе, а также при обновлении или вставке.

на самом деле этот запрос должен использоваться каждый раз, когда вы подключаетесь к базе данных. просто добавьте его для подключения кода.

1 голос
/ 13 мая 2010

Вам нужен UTF-8, чтобы умные кавычки и тире («» -) и другие символы не ASCII работали надежно:

(1) Убедитесь, что браузер отправляет вам символы, закодированные в UTF-8. Сделайте это, объявив страницу с формой UTF-8:

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    ...

(Игнорировать <form accept-encoding>, который не работает в IE.)

(2) PHP имеет дело с необработанными байтами и не заботится о том, в какой кодировке они находятся, но база данных заботится, поэтому вы должны указать, какая кодировка поступает из PHP. Вот что SET NAMES делает, хотя mysql_set_charset может быть предпочтительнее.

(3) Как только нужные символы достигнут базы данных, их нужно будет сохранить в кодировке Unicode, чтобы убедиться, что все символы могут поместиться. Каждый столбец может иметь различную кодировку, но вы можете использовать DEFAULT CHARACTER SET utf8, когда CREATE table, чтобы все текстовые столбцы в нем использовали UTF-8. Вы также можете установить набор символов по умолчанию для базы данных или всего сервера на utf8, если хотите.

Если у вас уже есть CREATE d таблиц и они сопоставлены не в UTF-8, вам придется воссоздать или изменить таблицы. Вы можете проверить текущую сортировку, используя SHOW FULL COLUMNS FROM sometable;.

(4) Убедитесь, что вы HTML-кодируете текст, который вы выводите из PHP, используя htmlspecialchars(), а не htmlentities(), что по умолчанию будет путать не-ASCII символы.

[В качестве альтернативы (2) и (3) вы можете просто использовать кодировку Latin-1 по умолчанию для соединения и хранения таблицы, но тем не менее поместить в нее байты UTF-8. Недостаток этого подхода заключается в том, что он будет выглядеть неправильно для других инструментов, рассматривающих базу данных, и символы нижнего и верхнего регистров не будут сравниваться друг с другом ожидаемым образом без учета регистра.]

0 голосов
/ 13 мая 2010

Я предполагаю, что вы вставляете из какого-то текстового редактора, который преобразует " в угловую красивую цитату, и превращаете ваш - в mdash, что приводит к тому, что оба элемента представляются как ?.

Хотя вы настраивали свою базу данных для приема символов UTF8, вы, вероятно, не настраивали свой веб-сервер / PHP для приема этих символов. Попробуйте поиграть с mbstring функциями, но убедитесь, что вы не используете наклонные кавычки или тире.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...