2015-11-25 5 views
3

Я работаю на турецком сайте, который хранится много искаженных турецких символов в базе данных MySQL, как:PHP - плохо закодирована турецкие символы в базе данных MySQL

- ş as þ 
- ı as ý 
- ğ as ð 
- Ý as İ 

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

Turkish characters are not displayed correctly

Fix Turkish Charset Issue Html/PHP (iconv?)

PHP Turkish Language displaying issue

PHP MYSQL encoding issue (Turkish Characters)

Я использую имеющиеся PHP-MySQLi-Database-Class на GitHub с utf8 в качестве кодировки.

Я даже попытался заменить деформированные символы с str_replace, как:

$newString = str_replace (chr (253), "ı", $newString); 

Мой вопрос, как я могу решить эту проблему, не изменяя символы в базе данных? Есть ли лучшие практики? Это хороший вариант для замены персонажей?

EDIT: решить ее с помощью

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" /> 
+0

Вы определили, какой неправильный набор символов использовался для записи значений в базу данных?Вы можете попытаться установить свой 'character_set_client' в неправильный набор символов, прочитать данные, а затем записать данные обратно с помощью правильного. – 0xCAFEBABE

+0

Вы имеете в виду выбор, преобразование и вставку в таблицы? – dogano

+0

Судя по тому, что вы описали, кодировка была неправильной, когда кто-то вставил данные в базу данных. Самый последовательный способ исправить это - использовать одну и ту же кодировку для считывания неверно закодированных данных, а затем переписать ее в базу данных с правильной кодировкой. – 0xCAFEBABE

ответ

0

Два решения хороши

PHP MYSQL encoding issue (Turkish Characters)

PHP Turkish Language displaying issue

Также вы можете установить конфигурацию на PhpMyAdmin

Операции> Параметры Таблица> Упорядочение> выберите utf8_general_ci

если вы создаете таблицы уже редактировать параметры сортировки структуры также

+0

обратите внимание, что значения не хранятся в базе данных, поэтому первое решение не применимо. Я также добавил все метатеги к html. – dogano

+0

попытайтесь восстановить данные после редактирования сортировки на MySql –

+0

спасибо. Но в настоящее время я решил это, изменив кодировку на iso-8859-9. Может быть, позже я изменю сортировку – dogano

0

SELECT CONVERT(CONVERT(UNHEX('d0dddef0fdfe') USING ...) USING utf8);

latin5/iso-8859-1 показывает ĞİŞğış
latin1/iso-8859-9 показывает ÐÝÞðýþ

Вы смешивая два одинаковых кодировки; см. первый абзац в https://en.wikipedia.org/wiki/ISO/IEC_8859-9.

«Сортировка» предназначена только для сортировки. Но сначала вам нужно изменить CHARACTER SET на latin5. Затем измените сопоставление на latin5_turkish_ci. (Поскольку это значение по умолчанию для latin5, никаких действий не требуется.)

Это может достаточно, чтобы сделать изменения в MySQL: EDIT 3

NO, this is probably wring -- ALTER TABLE tbl CONVERT TO CHARACTER SET latin5; 

После просмотра более вопроса, это "2 шага ALTER", вероятно, правильно:

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; 
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET latin5 ...; 

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

2-step ALTER полезен, если байт верны, но CHARACTER SET нет.

CONVERT TO следует использовать, когда символы правильно, но вы хотите другую кодировку (и CHARACTER SET). См. Case 5.

Edit 1

E7 и FD и CP1250, dec8, latin1 и latin2 для ç и ý. FD in latin5 - ı. Я пришел к выводу, что ваша кодировка - latin1, а не latin5.

Вы говорите, что вы не можете изменить «скрипты». Давайте посмотрим на ваши ограничения. Вы ограничены на стороне INSERT? Или сторона SELECT? Или оба? Что представляет собой текст; HTML? MySQL хочет перейти с latin1 на/from latin5, и вы вставляете/выбираете (на основе нескольких настроек). И/или вы можете лгать HTML (через метатег), чтобы заставить его интерпретировать байты по-разному. Пожалуйста, укажите детали потока данных.

Edit 2

Учитывая, что HEX в таблице E7FD6B6172FD6C6D6173FD6E61, и оно должно быть вынесено как çıkarılmasına ... Примечание особенно вторая буква должна показать, как ı (турецкий Dotless небольшой I), не ý (маленький Y с острым), правильно?

Start, пытаясь

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9"/> 

Это должно дать вам `latin5 рендеринга, как вы уже выяснили. IANA Reference.

Что касается «Лучшей практики», это связано с изменением способа ввода текста. Вы заявили об этом как о запрете.

Очевидно, у вас есть латинские символы, сохраненные в столбце latin1. Поскольку latin1 не требует какой-либо проверки, вы можете без проблем вставлять и извлекать латинские символы.

Это не касается желания иметь турецкую сортировку. В случае необходимости я, вероятно, смогу указать способ указания турецкого заказа на конкретные заявления; просьба представить образец заявления.

+0

, изменяя таблицу на latin5. Ошибка: Код ошибки: 1366. Неверное строковое значение: '\ xFEand \ xFD ....' для столбца 'caption' в строке 1 В настоящее время я использую HTML-тег мета-кодировки для iso-8859-9 в HTML и он работает .. но я не знаю, является ли это хорошим решением или нет – dogano

+0

Хммм ... Давайте подберем и кое-что проверим. Пожалуйста, выполните «SELECT col, HEX (col) FROM tbl WHERE ...», чтобы показать что-то, что выходит «неправильно». И укажите, что вы ожидаете от этого столбца для этой строки. –

+0

Проблема в том, что значения плохо кодируются в таблицах. Я могу только изменить таблицы, но у меня нет возможности изменить сценарии, которые вставляют данные ... Пример: col: 'Ekonomik krizin faturasýný kendilerine çýkarýlmasýna kýzan emekçiler, sokaða çýkarak tepki gösterdi.', Hex (col) : «456B6F6E6F6D696B206B72697A696E2066617475726173FD6EFD206B656E64696C6572696E6520E7FD6B6172FD6C6D6173FD6E61206BFD7A616E20656D656BE7696C65722C20736F6B61F06120E7FD6B6172616B207465706B692067F67374657264692E» – dogano