2014-02-06 3 views
3

Ну, плохо попробуйте объяснить это, пожалуйста, извините мой английский.Проблемы с вставкой строк в MySQL

У меня есть сценарий, который сбрасывает всю базу данных в файл SQL, а затем другой скрипт разбивает строки и выполняет их для удаления, создания и вставки данных. Проблема в том, что некоторые строки «обрезаны». Он просто вставить строку, пока она не достигнет первого специального символа, например:

Для строки:

"Pantalon azul marino de Poliéster con cinta blanca bordada con el nombre de la institución en uno de sus costados." 

это просто вставить: не отбрасывается

"Pantalon azul marino de Poli" 

Нет ошибок. Но это происходит только с использованием сценария, но когда я запускаю запросы вручную и импортирую файл SQL в phpMyAdmin, все работает. Все установлено на utf8.

У меня нет идей, любая помощь будет очень оценена.

include ('../core/connection.inc.php'); 
    $conn = dbConnect('admin'); 
    $conn->query("SET NAMES 'utf8'"); 
    $conn->set_charset("utf8"); 
    $type = 0; 

    // Temporary variable, used to store current query 
    $templine = ''; 
    // Read in entire file 
    $lines = file('db-backup.sql'); 
    // Loop through each line 
    $correct = 0; 
    $failed = 0; 
    foreach ($lines as $line){ 
    // Skip it if it's a comment 
    if (substr($line, 0, 2) == '--' || $line == '') 
     continue; 
    // Add this line to the current segment 
    $templine .= $line; 
    // If it has a semicolon at the end, it's the end of the query 
    if (substr(trim($line), -1, 1) == ';'){ 
     $templine = str_replace("latin1","utf8",$templine); 
     $templine = trim($templine); 

     // Perform the query 
     $conn->query($templine); 
     $errno = $conn->errno; 
     $error = $conn->error; 
     if($conn->affected_rows > 0){ 
      echo "OK: (".$templine.")<br/>"; 
      $correct++; 
     } else { 
      echo "Failed: (".$templine.")<br/>"; 
      echo "&nbsp;&nbsp; Errno: ".$errno." <br/>"; 
      echo "&nbsp;&nbsp; Error: ".$error." <br/>"; 
      $failed++; 
     } 
     $templine = ''; 
    } 
    } 
+2

проверить поле размера вашего стола. i, вы должны увеличить размер поля до 'varchar (256)' или более –

+0

@SatishSharma это поле типа текста:/ –

+0

Очевидно, что это связано с транслитерацией, содержащейся в усеченной строке. Можете ли вы вставить строку вручную из командной строки mysql без ее усечения? –

ответ

0

Я не знаю, как выглядит ваш стол, но я могу дать вам эту дополнительную консультацию на всякий случай. Убедитесь, что у вас есть ваши смещ_по_столбцы DB установлены в UTF8:

ALTER TABLE {table_name} CHANGE COLUMN {col_name} {col_name} TEXT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL ; 
2

Я предполагаю, что файл дампа вы импортируете не UTF8.

PHP отправляет байты из файла в MySQL без какого-либо преобразования. Символ é в вашем файле, вероятно, находится в latin1 на основе изменения, которое вы делаете, вероятно, представленным одним байтом со значением> 127. Это не UTF-8. Вы пообещали MySQL, что вы отправите действительный UTF-8, и он перестает читать строку, когда попадает на недопустимый байт.

Вы могли бы рассмотреть:

  • перекодировать файл дампа, как UTF-8
  • выяснить, какую кодировку файла дампа в, и загрузить его в MySQL, используя эту кодировку

Лично я думаю, что подошел бы к проблеме по-другому:

  1. Загрузить файл дампа в MySQL с помощью th e клиент командной строки или что-то подобное. Вы знаете, что это работает.
  2. Измените набор символов каждого столбца после импорта - вы можете использовать данные в information_schema для сборки операторов ALTER TABLE и заставить MySQL правильно выполнить преобразование.
+0

Совершенно определенно у вас есть недопустимый символ для UTF-8 - MySQL читает его и задыхается, и поэтому останавливает передачу там. Возможно ИМПОРТ НЕ-UTF-8 .sql-файл, но вы должны указать точную кодировку этого файла phpMyAdmin (или что-то еще), чтобы он мог перевести его на UTF-8 «на лету». И горе вам, если у вас есть _mixture_ кодировок в файле. –

+0

, если файл дампа не закодирован, поскольку UTF-8 не должен терпеть неудачу и при импорте файла в phpMyAdmin в виде кодированного файла UTF-8? Во всяком случае, я точно не знаю, почему, но удалили линии «Set Names» и «Set Charset». Итак, на данный момент я сохраню это, но в любом случае я проверю сценарий «демпинга», может быть, проблема с кодировкой, а не в «импортирующем» скрипте. –

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