2012-09-18 46 views
2

我已經編寫了一個PHP腳本來使用Unicode數據填充MySQL表。不過,我遇到了一些小問題。例如,對於空間字符(ID = 32)的character柱是空的,甚至當我單獨運行下面的命令:在MySQL中存儲單個空格字符

UPDATE unicode SET `character` = ' ' WHERE id = 32; 

任何想法?下面是我使用填充表的腳本(包含腳本common.php定義database功能,這是一個PDO對象):

<?php 

include_once('common.php'); 

// Fetch data from Unicode website 
$file = fopen('http://www.unicode.org/Public/UNIDATA/UnicodeData.txt', 'r'); 

// Iterate through each line of the file 
while($row = fgets($file)) { 

    // Gather data 
    $column = explode(';', $row); 
    $id = hexdec($column[0]); 
    $name = $column[1]; 
    $general_category = $column[2]; 
    $uppercase_mapping = hexdec($column[12]); 
    $lowercase_mapping = hexdec($column[13]); 
    $titlecase_mapping = hexdec($column[14]); 

    // Build the database query 
    $query = sprintf("INSERT IGNORE INTO unicode VALUES (%d, CHAR(%d USING UTF8), '%s', '%s', %d, %d, %d)", 
     $id, 
     $id, 
     $name, 
     $general_category, 
     $uppercase_mapping, 
     $lowercase_mapping, 
     $titlecase_mapping); 

    database()->query($query); 
    echo $id.' '; 
} 

?> 
+0

由於您使用的是PDO,您爲什麼使用'sprintf'來編寫查詢?這不是使用[適當的SQL佔位符]的安全替代方法(http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/)。 – tadman

+2

你怎麼確定它是空的? –

+0

@AlainCollins:通過檢查。我正在使用MySQL工作臺來探測值。 –

回答

2

如果你有CHAR列類型數據庫驅動程序可能會剝離自動拖尾空格。有些驅動程序可能會這樣做,即使在VARCHAR數據中,如果它們未配置爲保留它們。

你可以查閱一下在數據庫中選擇出一個十六進制編碼的版本實際上是:

SELECT HEX(character) FROM unicode WHERE id=32 

你應該看到20,等效十六進制的32

+0

謝謝@tadman。我剛試過'SELECT HEX(\'character \')FROM unicode WHERE id = 32',結果是空的。 'id = 33'的查詢返回'21'。仍然不知道如何解決這個問題... –

+0

我很確定這是因爲'CHAR'是空間填充,固定大小,空間是一個特殊的字符。 – tadman

+0

這可能是MySQL中一個長期存在的bug(http://bugs.mysql.com/bug.php?id=8546)。 – tadman

0

character必須CHAR類型

+0

@Clodaldo:我只是重複檢查; 'character'確實是'CHAR'類型。 –

相關問題