2011-07-22 55 views
1

我有一個非常奇怪的問題,我的一個數據庫表。我已經歸類在區(A區,B區等)和各領域當我運行一個查詢在下拉菜單中顯示他們我得到奇怪的排序問題在PHP中,MySQL與UTF8數據

  • A區 - 區域K
  • A區 - 區域L
  • 區A - M區
  • A區 - 區N
  • A區 - 區○
  • 區A - 區域P
  • 區A - A區
  • 區A - B區
  • 區A - C區
  • A區 - 區d
  • ...
  • 區A - G區
  • B區 - 區域K
  • B區 - 區域L​​
  • B區 - 區域M
  • B區 - 區N
  • B區 - 區○
  • B區 - 區域P
  • 區B - A區
  • 區B - B區
  • 區B - C區
  • B區 - 區d

一些奇怪的原因的區域顯示從K-> Z然後從A開始。

我的表結構如下:CREATE TABLE區域(id int(11)NOT NULL AUTO_INCREMENT,zone varchar(20)DEFAULT NULL,area varchar(100 )NOT NULL,距離浮點數(9,2)DEFAULT NULL,PRIMARY KEY (id))ENGINE = MyISAM DEFAULT CHARSET = utf8;

我的表中的數據是用希臘語寫的,我只是做了上面的例子,所以你可以理解並看到問題。要查看實際的數據(希臘),您可以訪問http://www.emanaviko.gr/lists/suburbs.php

+1

什麼是你查詢的樣子,什麼是這個數據的到來,從表中的字符集/歸類? –

+0

一切都在utf8中,數據庫,表和php文件。 – bikey77

+0

我的查詢是:SELECT * FROM地區ORDER BY區,面積 – bikey77

回答

1

我已經導入數據到一個表,它似乎從排序你會得到什麼不同。你的默認排序規則是什麼?我的是utf8_general_ci。

請注意,即使您的西部看起來的信件,實際上,不是西方字母。例如,你的K實際上是unicode字符「希臘大寫字母KAPPA」。

mysql> show create table foo; 

+-------+----------------------------------------------------------------------------------+ 
| Table | Create Table                  | 
+-------+----------------------------------------------------------------------------------+ 
| foo | CREATE TABLE `foo` (
    `z` text, 
    `a` text 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 | 
+-------+----------------------------------------------------------------------------------+ 

mysql> select * from foo order by z,a collate utf8_general_ci; 
+-------------+-------------------------------------------------+ 
| z   | a            | 
+-------------+-------------------------------------------------+ 
| ΖΩΝΗ Α | Αγία Βαρβάρα       | 
| ΖΩΝΗ Α | Αγία Παρασκευή      | 
| ΖΩΝΗ Α | Αγιοι Ανάργυροι     | 
| ΖΩΝΗ Α | Αγιος Στέφανος      | 
| ΖΩΝΗ Α | Αιγάλεω         | 
| ΖΩΝΗ Α | Ανθούσα         | 
| ΖΩΝΗ Α | Ανοιξη         | 
| ΖΩΝΗ Α | Ανω Λιόσια        | 
| ΖΩΝΗ Α | Αχαρνές (Μενίδι)     | 
| ΖΩΝΗ Α | Βριλήσσια        | 
| ΖΩΝΗ Α | Γαλάτσι         | 
| ΖΩΝΗ Α | Γέρακας         | 
| ΖΩΝΗ Α | Γλυκά Νερά        | 
| ΖΩΝΗ Α | Διόνυσος        | 
| ΖΩΝΗ Α | Δροσιά         | 
| ΖΩΝΗ Α | Εκάλη          | 
| ΖΩΝΗ Α | Ζεφύρι         | 
| ΖΩΝΗ Α | Ηράκλειο        | 
| ΖΩΝΗ Α | Θρακομακεδόνες     | 
| ΖΩΝΗ Α | Ιλιον          | 
| ΖΩΝΗ Α | Κηφισιά         | 
| ΖΩΝΗ Α | Κρυονέρι        | 
| ΖΩΝΗ Α | Λυκόβρυση        | 
| ΖΩΝΗ Α | Μαρούσι         | 
| ΖΩΝΗ Α | Μελίσσια        | 
| ΖΩΝΗ Α | Νέα Ερυθραία       | 
| ΖΩΝΗ Α | Παλλήνη         | 
| ΖΩΝΗ Α | Παπάγου         | 
| ΖΩΝΗ Α | Πεντέλη         | 
| ΖΩΝΗ Α | Περιστέρι        | 
| ΖΩΝΗ Α | Πετρούπολη       | 
| ΖΩΝΗ Α | Πεύκη          | 
| ΖΩΝΗ Α | Ροδόπολη        | 
| ΖΩΝΗ Α | Σταμάτα         | 
| ΖΩΝΗ Α | Φιλοθέη         | 
| ΖΩΝΗ Α | Χαϊδάρι         | 
| ΖΩΝΗ Α | Χαλάνδρι        | 
| ΖΩΝΗ Α | Χαλκηδόνα        | 
| ΖΩΝΗ Α | Χολαργός        | 
| ΖΩΝΗ Α | Ψυχικό         | 
| ΖΩΝΗ Β | Αγία Σοφία        | 
| ΖΩΝΗ Β | Αγιος Βασίλειος     | 
| ΖΩΝΗ Β | Αγιος Δημήτριος(Μπραχάμι) | 
| ΖΩΝΗ Β | Αλιμος         | 
| ΖΩΝΗ Β | Ανω Γλυφάδα       | 
| ΖΩΝΗ Β | Αργυρούπολη       | 
| ΖΩΝΗ Β | Βάρη          | 
| ΖΩΝΗ Β | Βάρκιζα         | 
| ΖΩΝΗ Β | Βούλα          | 
| ΖΩΝΗ Β | Βουλιαγμένη       | 
| ΖΩΝΗ Β | Βύρωνας         | 
| ΖΩΝΗ Β | Γλυφάδα         | 
| ΖΩΝΗ Β | Δάφνη          | 
| ΖΩΝΗ Β | Ελληνικό        | 
| ΖΩΝΗ Β | Ζωγράφου        | 
| ΖΩΝΗ Β | Ηλιούπολη        | 
| ΖΩΝΗ Β | Καβούρι         | 
| ΖΩΝΗ Β | Καισαριανή       | 
| ΖΩΝΗ Β | Καλλιθέα        | 
| ΖΩΝΗ Β | Καλλίπολη        | 
| ΖΩΝΗ Β | Καμίνια         | 
| ΖΩΝΗ Β | Καστέλα         | 
| ΖΩΝΗ Β | Νέα Σμύρνη        | 
| ΖΩΝΗ Β | Παλαιό Φάληρο      | 
| ΖΩΝΗ Β | Υμηττός         | 
+-------------+-------------------------------------------------+ 
65 rows in set (0.00 sec) 

mysql> set names utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select * from foo order by z,a collate utf8_general_ci; 
+-------------+-------------------------------------------------+ 
| z   | a            | 
+-------------+-------------------------------------------------+ 
| ΖΩΝΗ Α | Αγία Βαρβάρα       | 
| ΖΩΝΗ Α | Αγία Παρασκευή      | 
| ΖΩΝΗ Α | Αγιοι Ανάργυροι     | 
| ΖΩΝΗ Α | Αγιος Στέφανος      | 
| ΖΩΝΗ Α | Αιγάλεω         | 
| ΖΩΝΗ Α | Ανθούσα         | 
| ΖΩΝΗ Α | Ανοιξη         | 
| ΖΩΝΗ Α | Ανω Λιόσια        | 
| ΖΩΝΗ Α | Αχαρνές (Μενίδι)     | 
| ΖΩΝΗ Α | Βριλήσσια        | 
| ΖΩΝΗ Α | Γαλάτσι         | 
| ΖΩΝΗ Α | Γέρακας         | 
| ΖΩΝΗ Α | Γλυκά Νερά        | 
| ΖΩΝΗ Α | Διόνυσος        | 
| ΖΩΝΗ Α | Δροσιά         | 
| ΖΩΝΗ Α | Εκάλη          | 
| ΖΩΝΗ Α | Ζεφύρι         | 
| ΖΩΝΗ Α | Ηράκλειο        | 
| ΖΩΝΗ Α | Θρακομακεδόνες     | 
| ΖΩΝΗ Α | Ιλιον          | 
| ΖΩΝΗ Α | Κηφισιά         | 
| ΖΩΝΗ Α | Κρυονέρι        | 
| ΖΩΝΗ Α | Λυκόβρυση        | 
| ΖΩΝΗ Α | Μαρούσι         | 
| ΖΩΝΗ Α | Μελίσσια        | 
| ΖΩΝΗ Α | Νέα Ερυθραία       | 
| ΖΩΝΗ Α | Παλλήνη         | 
| ΖΩΝΗ Α | Παπάγου         | 
| ΖΩΝΗ Α | Πεντέλη         | 
| ΖΩΝΗ Α | Περιστέρι        | 
| ΖΩΝΗ Α | Πετρούπολη       | 
| ΖΩΝΗ Α | Πεύκη          | 
| ΖΩΝΗ Α | Ροδόπολη        | 
| ΖΩΝΗ Α | Σταμάτα         | 
| ΖΩΝΗ Α | Φιλοθέη         | 
| ΖΩΝΗ Α | Χαϊδάρι         | 
| ΖΩΝΗ Α | Χαλάνδρι        | 
| ΖΩΝΗ Α | Χαλκηδόνα        | 
| ΖΩΝΗ Α | Χολαργός        | 
| ΖΩΝΗ Α | Ψυχικό         | 
| ΖΩΝΗ Β | Αγία Σοφία        | 
| ΖΩΝΗ Β | Αγιος Βασίλειος     | 
| ΖΩΝΗ Β | Αγιος Δημήτριος(Μπραχάμι) | 
| ΖΩΝΗ Β | Αλιμος         | 
| ΖΩΝΗ Β | Ανω Γλυφάδα       | 
| ΖΩΝΗ Β | Αργυρούπολη       | 
| ΖΩΝΗ Β | Βάρη          | 
| ΖΩΝΗ Β | Βάρκιζα         | 
| ΖΩΝΗ Β | Βούλα          | 
| ΖΩΝΗ Β | Βουλιαγμένη       | 
| ΖΩΝΗ Β | Βύρωνας         | 
| ΖΩΝΗ Β | Γλυφάδα         | 
| ΖΩΝΗ Β | Δάφνη          | 
| ΖΩΝΗ Β | Ελληνικό        | 
| ΖΩΝΗ Β | Ζωγράφου        | 
| ΖΩΝΗ Β | Ηλιούπολη        | 
| ΖΩΝΗ Β | Καβούρι         | 
| ΖΩΝΗ Β | Καισαριανή       | 
| ΖΩΝΗ Β | Καλλιθέα        | 
| ΖΩΝΗ Β | Καλλίπολη        | 
| ΖΩΝΗ Β | Καμίνια         | 
| ΖΩΝΗ Β | Καστέλα         | 
| ΖΩΝΗ Β | Νέα Σμύρνη        | 
| ΖΩΝΗ Β | Παλαιό Φάληρο      | 
| ΖΩΝΗ Β | Υμηττός         | 
+-------------+-------------------------------------------------+ 

更新:

確定。我導入了你的轉儲文件。

您的問題是表中包含錯誤的數據。它實際上是雙重編碼的utf8。

考慮使用phpmyadmin的表:你應該看到垃圾,而不是文字。

你可能有一個錯誤在你的PHP代碼,你忘了發出「組名稱UTF8」或mysql_set_charset(「UTF-8」)。插入時你有同樣的錯誤。

因此,當你發出

INSERT 'Αγία Παρασκευή' 

PHP發送UTF-8編碼的數據到MySQL。但MySQL相信這是拉丁文1。所以,它再次將其轉換爲utf8,並且表中包含垃圾。

當您選擇時,MySQL UTF8轉換回latin1的,但是這實際上給你你原來發送utf8的,所以它在你的應用程序中正確顯示。

但表的內容是垃圾,分類垃圾順序;)

首先,你需要修復的bug在你的代碼。

然後,您需要導出這些表(您給出的文件正常工作),放下它們,然後使用正確的字符集(在文件頂部添加一個SET NAMES utf8)重新導入它們。

更新2:

如果你想知道的數據是不是垃圾,也有簡單的技巧:

SELECT upper(yourcolumn) (or lower()...) 
SELECT char_length(yourcolumn) 

如果它的工作原理(即,你得到正確的大寫或小寫字母並以字符正確的長度,那麼就意味着數據良好和mysql的理解是

常用的伎倆來檢查,如果你的MySQL連接被正確配置,將發行(在你的PHP代碼)這個查詢:

SELECT char_length('é'), octet_length('é'), upper('é') 
+-------------------+--------------------+-------------+ 
| char_length('é') | octet_length('é') | upper('é') | 
+-------------------+--------------------+-------------+ 
|     1 |     2 | É   | 
+-------------------+--------------------+-------------+ 

當然,你可以做

SHOW VARIABLES LIKE '%character%'; 

我用phpmyadmin和mysql的控制檯。

+0

非常感謝。那麼我做錯了什麼? – bikey77

+0

我不知道。你可以傾倒桌子並把它放在網上嗎? – peufeu

+0

轉儲文件可以在這裏找到:http://www.emanaviko.gr/lists/suburbs.sql – bikey77

2

添加ORDER BY子句查詢:

SELECT * 
FROM areas 
ORDER BY 
     zone, area 
+0

我的表的結構是如下所示:CREATE TABLE'areas'('id' INT(11)NOT NULL AUTO_INCREMENT,'zone' VARCHAR(20)DEFAULT NULL,'area' VARCHAR(100)NOT NULL,'distance'浮子( 9,2)DEFAULT NULL,PRIMARY KEY('id'))ENGINE = MyISAM DEFAULT CHARSET = utf8; – bikey77

+0

@bikey:請將它發佈爲您帖子的更新。 – Quassnoi