Получаю из открытой (небезопасной) среды строки в кодировке UTF-8, которые в последствии сохраняю в базу данных MySQL. Но изредка мне попадаются строки, содержащие по всей видимости не совсем UTF-символы, и MySQL отказывается сохранять такие сроки в поля с коллэйшином utf8_general_ci, выдавая ошибку с кодом 1366: "Incorrect string value: '\xEF\xB1' for column 'name' at row 1". Можно было бы, конечно, сделать коллэйшин utf8_bin, но тогда это поле стало бы регистро-зависимым, а не хотелось бы.
Я хотел бы производить какую-то проверку строки на содержание в ней действительно UTF-8 символов, чтобы не UTF-8 символы заменить хотя бы на символы "?", чтобы MySQL не выдавал ошибку и это не приводило к потере и других данных. Вот только в стандартном окружении PHP я что-то не могу найти подходящих функций. Как вариант, можно разбивать строку на отдельные символы через mb_strlen() и mb_substr(), а потом делать какое-нибудь бессмысленное преобразование через iconv() типа из UTF-8 в UTF-16 и обратно. Если символ обратно сконвертировалось в тот же самый -- значит все окей, иначе -- заменяем на "?". Но я не знаю как корректно будут вести себя эти функции с некорректными строками. Есть ли какой-то более простой и верный способ осуществить желаемое?
Здравствуйте, Geri, Вы писали:
G>Получаю из открытой (небезопасной) среды строки в кодировке UTF-8, которые в последствии сохраняю в базу данных MySQL. Но изредка мне попадаются строки, содержащие по всей видимости не совсем UTF-символы, и MySQL отказывается сохранять такие сроки в поля с коллэйшином utf8_general_ci, выдавая ошибку с кодом 1366: "Incorrect string value: '\xEF\xB1' for column 'name' at row 1". Можно было бы, конечно, сделать коллэйшин utf8_bin, но тогда это поле стало бы регистро-зависимым, а не хотелось бы.
G>Я хотел бы производить какую-то проверку строки на содержание в ней действительно UTF-8 символов, чтобы не UTF-8 символы заменить хотя бы на символы "?", чтобы MySQL не выдавал ошибку и это не приводило к потере и других данных. Вот только в стандартном окружении PHP я что-то не могу найти подходящих функций. Как вариант, можно разбивать строку на отдельные символы через mb_strlen() и mb_substr(), а потом делать какое-нибудь бессмысленное преобразование через iconv() типа из UTF-8 в UTF-16 и обратно. Если символ обратно сконвертировалось в тот же самый -- значит все окей, иначе -- заменяем на "?". Но я не знаю как корректно будут вести себя эти функции с некорректными строками. Есть ли какой-то более простой и верный способ осуществить желаемое?
Здравствуйте, dkameleon, Вы писали:
D>mysql_real_escape_string не помогает?
Кажется ты и прав. Я использовал mysql_escape_string() и прежде просто не сталкивался с такой проблемой. Спасибо. А что если все-таки мне придет на вход совсем не UTF данные (бинарная строка)? Как MySQL сохранит ее в поле с UTF-ным коллэйшином?
Здравствуйте, Geri, Вы писали:
G>Здравствуйте, dkameleon, Вы писали:
D>>mysql_real_escape_string не помогает?
G>Кажется ты и прав. Я использовал mysql_escape_string() и прежде просто не сталкивался с такой проблемой. Спасибо. А что если все-таки мне придет на вход совсем не UTF данные (бинарная строка)? Как MySQL сохранит ее в поле с UTF-ным коллэйшином?
На сколько я знаю, они так и упадут внутрь в бинарном виде.
можешь поэкспериментировать — запихнуть в базу картинку, а потом извлечь её