2014-12-29 2 views
0

Я использую две базы данных на одном типичном сервере WAMP, а другой - локальную базу данных MySQL. Я замечаю, что есть некоторые отличия в том, что каждая база данных хранит blobs, и я замечаю это, когда я экспортирую строку и сравниваю каждый blob.Различия между кодировками blob между базами данных

Например, когда локальный MySQL экспортирует blob, любой символ «NUL» ASCII имеет префикс «\», но это не тот случай, когда он экспортируется из WAMP MySQL. Таким образом, чтобы соответствовать им, что я должен делать (в PHP для экспорта БД)

$val = str_replace(chr('NUL'), '\0', $val); 

Как я работаю через ищет больше различий между экспортом, я также должен был сделать это, а также

$val = str_replace(chr(0x9), chr(0x5c).chr(0x9), $val); 
$val = str_replace(chr(0xa), chr(0x5c).chr(0xa), $val); 

И это было прекрасно, для очень простого и крошечного образа. Но я могу представить, что есть тонна больше различий, с которыми я столкнусь, и я не могу объяснить их все правильно и своевременно. Мне интересно, что это значит. Обе таблицы - это механизм InnoDB и utf8_general_ci. Что еще может быть неправильно сконфигурировано?

+1

Звучит так, как SQL Anywhere возвращает результаты в виде строки и избегает байтов NUL, чтобы избежать раннего завершения строки на языках, которые завершают строки с помощью NUL. Он также, как представляется, избегает других символов управления строкой (9 == tab, a == line feed). Я предполагаю, что он, вероятно, избегает других байтов, которые ниже 0x20. У вас есть поле, определенное как «LONG BINARY»? – superultranova

+0

Спасибо. Одна ошибка, которую я сделал, заключается в том, что оба они являются MySQL. Оба столбца имеют тип «blob». Локальная команда дампа MySQL должна сбрасывать эти символы, а команда PHP - нет. Есть ли простое решение? – user3822370

+1

Так что оба экспортируются по-разному, что имеет смысл. Вы уверены, что они хранят данные по-разному? mysqldump выводит текстовый файл, поэтому я не удивлюсь, если он ускользнет от управляющих символов. PHP, с другой стороны, через PDO или mysqli_query будет возвращать двоичный файл, поскольку данные предназначены для использования вашим php-скриптом. Что именно вы пытаетесь сделать здесь? Импортировать данные из mysqldump через PHP? – superultranova

ответ

1

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

Если вы хотите сбросить blob с помощью запроса в PHP, у вас есть пара опций. Вы можете использовать SELECT ... INTO DUMPFILE fname или SELECT ... INTO OUTFILE fname и указать имя файла. Документация MySQL предлагает использовать SELECT INTO DUMPFILE специально для записи полей blob в файл. Существует также предложение FIELDS ESCAPED BY, которое можно использовать. Дополнительную информацию см. В документации по MySQL. http://dev.mysql.com/doc/refman/5.1/en/select-into.html.

Если техника SELECT ... INTO OUTFILE не будет работать для вас, вы можете попытаться получить данные о блобе из базы данных и избежать ее с помощью mysqli_real_escape_string, прежде чем записывать ее в файл дампа. Это должно в достаточной степени избежать данных, чтобы их можно было повторно вставить в базу данных. Имейте в виду, что кодировка должна соответствовать обеим таблицам.

+0

Это отстой, что я использую PDO. Хотелось бы, чтобы была функция escape, которая не требовала подключения mysqli. Кроме того, я не думаю, что я могу манипулировать любым из результатов дальше, если я использую INTO OUTFILE (который нужен моему клиенту для некоторых других полей ..!) – user3822370

+0

Есть ли способ перехватить содержимое, когда я делаю SELECT INTO OUTFILE?Я не знаю, где этот файл сохраняет (я угадываю каталог MySQL, на который у меня есть 0 доступ к этому веб-хосту) – user3822370

+0

Я вообще не знаю, что вы могли бы перехватить содержимое SELECT INTO OUTFILE. Однако вы можете указать полный путь к файлу, который вы хотите записать, таким образом, вы можете записать его в какой-либо каталог, к которому у вас есть доступ. – superultranova

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