2016-01-23 3 views
0

У меня есть проблема с отображением российских данных из моей базы данных MySQL. Предыстория: какой-то другой программист создал базу данных, и сейчас я несу ответственность за нее.Некоторые данные SQL на русском языке выводятся символом в конце

Моя проблема: На странице HTML выведен список операторов из моей базы данных. В заявлениях все россияне. Из всех 80 заявлений есть 6 утверждений, которые на их концах выводятся с черным значком с белым знаком вопроса в нем ().

Распространенное вещь (!!!) является то, что знак вопроса всегда появляется в конце заявления и утверждения являются самыми длинными с около 80 символов.

вот список некоторых заявлений на моем HTML странице:

  • Я действую скорее активно, агрессивно и, думая о своей выгоде
  • Как интровертный своенравный человек, который демонстрирует мало собственной ин
  • Являешься убедительным, располагающим и целеустремленным
  • Я демонстрирую разум и ясность, объективность и логику
  • Кого-то, кто самостоятельно мыслит и знает, как себе помочь
  • То мне следовало бы сдержанно реагировать и найти другой путь, чтобы получить бол

Я заглянул в базу данных в свои «заявления» и обнаружил, что операторы сохраняются как идентификационные символы. Например, спасенная запись для второго российского заявления выше (который содержит знак вопроса в конце) заключается в следующем:

ð Ð'ÐμйÑÑ,вую ÑÐºÐ¾Ñ € ÐμÐμ Ð'овÐμÑ € Ð¸Ñ , ÐμÐ »Ð¸ ьно окР° Ð · Ñ <вР° новозеландских ÑвоÐμ Ð'овÐμÑ € иÐμ Ñ,Ð ° кжÐμ Ð'Ñ € угим, коÑ,Ð¾Ñ € Ñ <дМ Ðº нÐμÐ

О таблице: Его сортировка utf8_unicode_ci с полями VARCHAR (150) как тип данных.

Мои вопросы:

  1. Почему операторы сохраняются с этими unidentifable буквами в моей таблице? Как я могу конвертировать их на русский?
  2. В чем причина символа вопросительного знака на выходе html? Как я могу избавиться от него?

EDIT:

В том же проекте я нашел еще одну проблему, которую я описать в отдельном посте. Может быть, эта проблема связана с этим?

PHP: Special char becomes question mark icon in substring

+0

"заявления сохраняются как идентификационные символы." - Вы уверены, что это не проблема отображения? Данные хранятся в UTF8, но кажется, что он отображается вам в CP1251 любым инструментом, который вы используете. – Timekiller

+0

Да, может быть проблема с отображением. Как я могу избавиться от проблемы? – Max

+0

, и вам кажется, что вам нужно также использовать сортировку utf8 для вашей таблицы. – ameenulla0007

ответ

0

Это звучит как простая проблема усечения. Varchar (150) говорит, что поле не более 150 байт. UTF8 может использовать более одного байта на символ - например, каждая буква в кириллице будет использовать 2 байта, в то время как символы пробела или запятой будут использовать 1 байт. Поэтому, если длина строки больше 150 байтов, возможно, что кириллическая буква усечена посередине. Например, в вашем втором предложении маленький и имеет код utf8 d0 b8, но был усечен до d0, который является непечатаемым символом, в результате чего вы видите ?. Вы ничего не можете с этим поделать, данные уже потеряны. Вы можете только отключить отображение, удалив автономный байт в диапазоне от C2..DF от конца строки.

Что касается неопознанных букв, которые вы видите, есть много факторов. Кодировка базы данных, кодирование соединений, сортировка таблиц и кодировка отображения, если вы используете веб-интерфейс, способствуют беспорядку, перед тем, как вы его увидите, может быть много повторных кодировок. Также возможно, что данные каким-то образом перекодируются при вставке и декодировании перед отображением - не самое худшее, что я видел в устаревшем коде. Вам придется экспериментировать и находить правильную комбинацию самостоятельно.

+0

Привет, Timekiller, большое спасибо за ваш ответ. Что было бы быстрыми мерами по исправлению ситуации? Увеличение varchar для будущих вставок? Как я могу удалить автономный байт с конца строки в моем случае? – Max

+0

Да, увеличьте размер поля, а затем посмотрите на функцию 'mb_strcut()' - в соответствии с руководством он позволяет вырезать строку до N байтов, не нарушая многобайтовую последовательность символов, это именно то, что вам нужно. Для замены недействительных символов utf8 взгляните на http://stackoverflow.com/a/13695364/1375470 - хотя в вашем конкретном случае может потребоваться замена регулярного выражения '[\ xC2- \ xDF] $' пустой строкой. – Timekiller

+0

Я только что узнал, что варчара (150) недостаточно. Я увеличу его до 300. Могут ли быть отрицательные последствия при увеличении его для каждой области? – Max

1

использует 'SET names=utf8' запрос во время вставки, проблема в том, при вводе (вставок), данные преобразуются в некоторые специальные символы.

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

+0

Означает ли это, что уже существующие данные в моей базе данных как-то потеряны и не могут быть преобразованы, чтобы добраться до значков вопросительных знаков? – Max

+0

, который предназначен для вставки данных. – ameenulla0007

+0

http://php.net/manual/en/function.htmlspecialchars-decode.php проверьте это руководство, чтобы преобразовать специальные или нежелательные символы в допустимую строку. – ameenulla0007

Смежные вопросы