【问题标题】:Why can't I use a specific collation in MySQL?为什么我不能在 MySQL 中使用特定的排序规则?
【发布时间】:2013-05-09 19:29:48
【问题描述】:

我有一个字符集latin1(由show variables like "character_set_database"; 检查)和latin1_swedish_ci(由SHOW TABLE STATUS; 检查)的默认排序规则的表。

我想使用在我的系统上编译的排序规则 latin1_general_cs 运行查询(由 Show collation LIKE "%_cs"; 检查):

select * from myTab WHERE col RLIKE '[[:upper:]]' COLLATE 'latin1_general_cs' LIMIT 10;

给出错误:

ERROR 1253 (42000): COLLATION 'latin1_general_cs' is not valid for CHARACTER SET 'utf8'

即使默认排序规则也不起作用:

select * from myTab WHERE col RLIKE '[[:upper:]]' COLLATE 'latin1_swedish_ci' LIMIT 10;

错误:

ERROR 1253 (42000): COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'

怎么了?是因为我的终端以 UTF-8 格式发送数据吗? (是“UTF-8 中的连接”吗?)我怎么能使用区分大小写的排序规则?我需要它,否则似乎无法检查大写字母。

【问题讨论】:

    标签: mysql character-encoding collation uppercase


    【解决方案1】:

    您可能会觉得这很有趣。

    Differences between utf8 and latin1

    我不能说我是这方面的专家,但据我所知,UTF8 和 Latin1 对字符的编码方式不同。所以尝试使用 Latin1 来整理 UTF8 是没有意义的。

    http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

    鉴于:

    CREATE DATABASE mydb
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;
    

    是一致的。

    更新

    抱歉,我刚刚重新阅读了您的问题,您说该表使用的是 latin1。奇怪的。您是否尝试过使用 utf8 排序规则?

    【讨论】:

    • utf8_general_cs 未安装/编译。我不知道如何安装它。但是在知道为什么它不起作用之前会很棒。可能还有一种方法可以转换我的数据,或者在启动 mySQL 时使用另一个字符集。现在我正在尝试使用alter table myTab convert to character set latin1 collate latin1_general_cs; 将表本身转换为排序规则latin1_general_cs。需要一段时间,可能是因为所有索引都必须重写
    • 看来SELECT * FROM myTab WHERE col RLIKE CONVERT(_utf8'[[:upper:]]' USING 'latin1') COLLATE 'latin1_general_cs' LIMIT 10; 有效。可能是因为与 mySQL 的连接是 UTF8 格式的。但似乎没有人知道,...我也在使用 R 连接到 MySQL - 我没有哪个字符集用于连接。我一直认为 MySQL 会自动完成工作并进行转换。
    【解决方案2】:

    我认为问题出在其他地方。 RLIKE 是正则表达式函数 COLLATE … 在这里没有作用。 看看->

    #1 - false
    SELECT 'koníček' = 'konicek' COLLATE utf8_czech_ci;
    
    #2 - false
    SELECT 'koníček' LIKE 'konicek' COLLATE utf8_czech_ci;
    
    #3 - false
    SELECT 'koníček' RLIKE 'konicek' COLLATE utf8_czech_ci;
    
    #4 - true
    SELECT 'koníček' = 'konicek' COLLATE utf8_general_ci;
    
    #5 - true
    SELECT 'koníček' LIKE 'konicek' COLLATE utf8_general_ci;
    
    #6 - false
    SELECT 'koníček' RLIKE 'konicek' COLLATE utf8_general_ci;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多