2009-02-27 46 views
0

我有以下表和數據:有人可以解釋爲什麼MySQL時,名稱=「測試」返回兩個值:「測試」和「測試」

CREATE TABLE `test` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(8) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; 

INSERT INTO `test` (`id`, `name`) VALUES (1, 'test'); 
INSERT INTO `test` (`id`, `name`) VALUES (2, 'test '); 

當我做下面的查詢來,它返回2行(兩行):

SELECT * FROM test WHERE name = 'test'; 
SELECT * FROM test WHERE name IN ('test'); 

任何人都可以向我解釋這個和/或如何解決它?

我在運行MySQL 5.0.27。

回答

4

從MySQL手冊:

注意所有MySQL校對規則類型PADSPACE的。這意味着MySQL中的所有CHAR和VARCHAR值都會進行比較,而不考慮任何尾隨空格。

注意到,MySQL不會把刪除5.0.3或更高版本的尾隨空格,它們被存儲,但比較時沒有使用:

VARCHAR值不填充時,他們被存儲。尾隨空格的處理取決於版本。從MySQL 5.0.3開始,根據標準SQL存儲和檢索值時會保留尾隨空格。在MySQL 5.0.3之前,將尾部空格存儲到VARCHAR列時將其從值中刪除;這意味着空間也沒有被檢索到的值。

這兩個報價都來自手冊的這一頁:10.4.1. The CHAR and VARCHAR Types

2

MySQL從varchar列的末尾刪除空格 - 不完全確定爲什麼這是在MySQL中以這種方式實現 - 顯然不是ANSI標準。

如果你想保留後面的空格,你可以選擇使用字符或文本字段。

編輯:我認爲這是改變as of version 5.0.3

1

使用二進制關鍵字:

SELECT * FROM試驗中,在二進制名稱= '測試';

相關問題