在对mySQL数据库中的值进行排序时,我得到了以下错误的排序顺序:SELECT * FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 order by title ASC
A
B
C
...
Ä
Ö
对于这个排序问题,我能做些什么?Ä应介于A和A之间或之后。
MySQL服务器版本:5.0.51a,支持UTF-8
我发现这与数据库的排序有关(参见德语链接:http://mysql-faq.sourceforge.net/tables3.html)。
脚本嵌入到TYPO3中,
setDBinit
设置为SET NAMES utf8
,forceCharset
设置为UTF-8
。所以UTF-8数据应该存储在ISO-8859-1(拉丁语1)中。列具有类型
text
和排序规则latin1_swedish_ci
。当我在phpMyAdmin中输入SHOW VARIABLES LIKE 'collation%'
时,我得到collation_connection utf8_general_ci
collation_database latin1_swedish_ci
collation_server latin1_swedish_ci
SHOW VARIABLES LIKE '%CHARACTER_SET%';
用phpMyAdmin给我character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
第一次尝试:
我试图在脚本中使用
SET NAMES utf8;
,但这并没有改变什么。第二次尝试:
我想用PHP进行排序(根据这个SOQ:How to sort an array of associative arrays by value of a given key in PHP?),但这并没有改变排序。
$title=array();
foreach ($result as $key => $row) {
$title[$key] = $row['title'];
}
array_multisort($title, SORT_ASC, $result);
第三次尝试:
我使用了这个mySQL语句(取自http://blog.mixable.de/mysql-order-by-und-deutsche-umlaute/):
SELECT * FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 order by title COLLATE latin1_swedish_ci;
排序没有变化。使用
utf-8
会导致错误(不允许排序)。第4次尝试:
SELECT *, REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE(REPLACE(title, 'Ä', 'A'), 'Ö', 'O'), 'Ü', 'U'), 'ä', 'a'), 'ö', 'o'), 'ü','u'), 'ß', 's') AS sortiert FROM tt_news WHERE pid=19 AND deleted=0 AND hidden=0 ORDER BY sortiert
来源:http://www.php-faq.de/q-mysql-umlaute-sortieren.html
在phpMyAdmin中工作,但在我的脚本中不工作。我得到以下错误:
Illegal mix of collations (latin1_swedish_ci,IMPLICIT), (utf8_general_ci,COERCIBLE), (utf8_general_ci,COERCIBLE) for operation 'replace'
我可以在PHP中进行正确的排序而不更改字符集或排序规则吗?
最佳答案
根据瑞典的规则,您看到的顺序是正确的:Ä、Ä和Ö是字母表的最后三个字母,在Z之后。如果您不喜欢,请更改列排序规则,以便进行其他操作。
alter table tt_news modify title text collate latin1_general_ci;
general
变体将字符的所有重音变体视为不同的,但在排序时将它们组合在一起;例如AZ
在ÄA
之前。如果您需要瑞典语以外的国家标准,这里有一个MySQL支持的开箱即用的列表:http://dev.mysql.com/doc/refman/5.6/en/charset-we-sets.html如果不能更改数据库中的列排序规则,可以告诉MySQL使用特定的排序规则来对查询进行排序。例如:
.... order by title collate latin1_general_ci
关于php - 按正确的顺序对mySQL数据库中的条目进行排序-变音符号在字符“Z”之后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17612897/