我的一个数据库表有一个非常奇怪的问题。在区域中有不同的区域(区域A、区域B等),当我运行查询以在下拉菜单中显示它们时,我会得到
<
<代码>H 19区域A-区域O<代码>H 111区域A-区域P<代码>H 212<代码>H 113区域A-区域A<代码>H 214<代码>H 115区域A-区域BH 216<代码>H 117区域C>H 218<代码H 119区A区A区代码>代码区代码>代码区代码><
H 139
Zone B- Area BH 240H 141Zone B- Area CH 242H 143区域B-区域DH 244F 245
由于一些奇怪的原因,这些区域从K->Z开始显示,然后从A开始。
我的表的结构如下:创建表区域( id int(11) NOT NULL AUTO_INCREMENT,zone varchar(20)默认NULL,area varchar(100) NOT NULL,距离浮点数(9,2)默认NULL,主键(id) ) ENGINE=MyISAM默认CHARSET=utf8;
我的表中的数据是希腊语,我做了上面的例子,这样你就可以理解和看到问题了。要查看实际数据(希腊语),可以访问
http://www.emanaviko.gr/lists/suburbs.php
发布于 2011-07-22 16:47:12
我已经将您的数据导入到一个表中,它似乎与您得到的数据排序不同。您的默认排序规则是什么?我的是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代码中有一个bug,您忘记发出一个"SET utf8“或一个mysql_set_charset("utf8")。你插入的时候也有同样的错误。
因此,当你发布
INSERT 'Αγία Παρασκευή'
PHP将utf-8编码数据发送到MySQL。但MySQL认为这是latin1。因此,它再次将其转换为utf8,并且您的表包含垃圾。
当您选择时,mysql将utf8转换回latin1,但这实际上给了您最初发送的utf8,因此它在应用程序中正确显示。
但是表的内容是垃圾,并按垃圾顺序排序;)
首先,您需要修复代码中的bug。
然后,您需要导出这些表(您给出的文件很好),删除它们,并使用正确的字符集重新导入它们(在文件的顶部添加一个集合名称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控制台。
发布于 2011-07-22 16:06:21
将ORDER BY
子句添加到查询中:
SELECT *
FROM areas
ORDER BY
zone, area
https://stackoverflow.com/questions/6792768
复制相似问题