MySQL中丹麦语字母排序异常问题求助
解决MySQL城市名称排序错误的方案
问题根源
你遇到的排序错误本质是数据编码存储异常:数据库中显示的København是UTF-8字符København被错误存储为latin1编码导致的乱码。此时即便指定丹麦语排序规则,MySQL也是基于乱码的字节值排序,自然不符合逻辑。
修复步骤
1. 修正数据编码(核心)
先将存储的乱码字节转换为正确的UTF-8字符,同时设置正确的排序规则:
-- 第一步:将city字段临时改为latin1字符集(保留原始字节不转换) ALTER TABLE your_postcode_table MODIFY COLUMN city VARCHAR(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci; -- 第二步:将字段改为utf8mb4(推荐,支持全UTF-8字符)并设置丹麦语排序规则 ALTER TABLE your_postcode_table MODIFY COLUMN city VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_danish_ci;
注意替换
your_postcode_table为你的实际表名;若仍需使用utf8(即utf8mb3),可将utf8mb4替换为utf8,但推荐用utf8mb4兼容更多字符。
2. 确保PHP数据库连接编码正确
避免后续再出现编码存储问题,PHP连接MySQL时需明确指定UTF-8编码:
- 若使用PDO:
$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'pass'); - 若使用mysqli:
$conn = mysqli_connect('localhost', 'user', 'pass', 'your_db'); mysqli_set_charset($conn, 'utf8mb4');
3. 执行正确排序
数据修复后,直接使用以下语句即可得到符合丹麦语规则的排序结果:
SELECT * FROM your_postcode_table ORDER BY city ASC;
若需临时指定排序规则(比如字段默认规则不是丹麦语),可使用:
SELECT * FROM your_postcode_table ORDER BY city COLLATE utf8mb4_danish_ci ASC;
内容的提问来源于stack exchange,提问作者Jeppe Donslund
相关产品推荐
相关产品推荐

