gpt4 book ai didi

mysql - MySQL中的特殊字符排序

转载 作者:行者123 更新时间:2023-12-05 07:07:24 27 4
gpt4 key购买 nike

我在从 MySQL 中排序选择时遇到问题。我有一些以“A”、“Á”、“Z”和“Ž”开头的名字来显示一些。奇怪的是,“A”和“Á”被排序为同一个字母而不是单独的字母。这意味着它可能会像这样出现:

  • 阿克
  • 进阶
  • 阿加
  • 聚集

我知道 Á 是 A 的子字母,但我希望将其分组,因此所有 A 都在前面,然后是 Á。该字段的排序规则是 utf8mb4_unicode_ci。

我做错了什么?

更新
如果 Á 被视为与 A 相同的字母,则排序没问题,因为它会查看下一个字母,依此类推。但我希望 Á 与 A 分开,所以它会像这样排序:

  • 阿克
  • 进阶
  • 聚集
  • 阿加

最佳答案

UTF8MB4 字符集的以下 3 个排序规则看起来很有前途,即 utf8mb4_icelandic_ciutf8mb4_is_0900_ai_ciutf8mb4_is_0900_as_cs。使用@Paul Spiegel 示例的结果是:

word
====
Ab
Ac
Ae
Ád
Áf
Ba
Ca
Št
Zo
Žv

db-fiddle code

我通过使用 PROCEDURE 检查可用的排序规则来识别它们。

CREATE PROCEDURE `Try_Collation`()
BEGIN

DECLARE v_finished INTEGER DEFAULT 0;
DECLARE c_collation varchar(100) DEFAULT "";

-- read available collations for utf8mb4
DECLARE table_cursor CURSOR FOR
SELECT COLLATION_NAME
FROM INFORMATION_SCHEMA.COLLATIONS
WHERE CHARACTER_SET_NAME='utf8mb4';

DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;

OPEN table_cursor;

Loop_label: LOOP -- test individual collations by loop

-- read one collation to table_cursor
FETCH table_cursor INTO c_collation;

IF v_finished = 1 THEN
LEAVE Loop_label;
END IF;

-- save the ordered table to a temp table
DROP TEMPORARY TABLE IF EXISTS temp_table;
CREATE TEMPORARY TABLE temp_table (
`word` varchar(50)
);

SET @s=CONCAT(
"INSERT INTO temp_table ",
"(select word from test ",
"order by convert(word using utf8mb4) ",
"collate ",c_collation,");");

PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- set some filtering rules for checking orders
IF (select word from temp_table limit 2,1)='Ád' THEN
ITERATE Loop_label; -- skip to next loop iteration
END IF;
IF (select word from temp_table limit 5,1)='Zo' THEN
ITERATE Loop_label; -- skip to next loop iteration
END IF;

SELECT c_collation; -- print out current collation
SELECT * FROM temp_table; -- print out ordered table

END LOOP Loop_label;

CLOSE table_cursor;

END;

CALL Try_Collation();

Code link

关于mysql - MySQL中的特殊字符排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62151426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com