2014-02-06 29 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" 

不引發錯誤。但是,這隻發生在使用腳本,但是當我手動運行查詢並導入phpMyAdmin中的SQL文件一切正常。 順便提一下,一切都設置爲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

檢查您的表的字段大小。我的事情你應該增加字段大小爲'VARCHAR(256)'以上 –

+0

@SatishSharma的字段是文本類型:/ –

+0

顯然它必須與包含在字符串中的譯音被截斷。你可以插入字符串,手動從MySQL命令行,而不截斷? –

回答

0

我不知道你的桌子是怎麼樣的,但我可以給你一些額外的建議以防萬一。確保你有你的數據庫的cols設置爲UTF-8:

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使用日e命令行客戶端或類似的東西。你知道這是有效的。
  2. 在導入後更改每列的字符集 - 您可以使用information_schema中的數據彙編ALTER TABLE語句並讓MySQL正確執行轉換。
+0

很明顯,你有一個UTF-8無效字符 - MySQL讀取它和扼流圈,並因此停止在那裏的傳輸。可以導入非UTF-8 .sql文件,但必須告訴phpMyAdmin(或其他任何)該文件的確切編碼,以便它可以將它轉換爲UTF-8。如果你在文件中有一個_mixture_的編碼,那麼對你而言有禍了。 –

+0

如果轉儲文件沒有被編碼爲UTF-8,它不應該也會失敗當我在phpMyAdmin中導入文件作爲UTF-8編碼文件?無論如何,我不知道爲什麼,但刪除「設置名稱」和「設置字符集」行工作。所以,現在,我會保持這種方式,但無論如何,我會檢查「傾銷」腳本,也許存在編碼問題,而不是「導入」腳本。 –