这个问题是以下问题的扩展-如何使mysql在进行字符串比较时考虑控制字符?
这是我的查询-
SELECT 'abc' < 'abcSOH' COLLATE utf8mb4_0900_bin;
这里SOH是报头的开始,它是一个ASCII控制字符,ASCII码为1。我的期望是,这个查询将返回1,因为第二个字符串的长度是4。我甚至尝试过Space
(ASCII码32),结果也一样!!
如果您检查这个选项,您可以看到只有'utf8mb4_0900_bin'排序规则给出预期的结果。我测试过的所有其他排序都给出了相反的结果。
https://dbfiddle.uk/mDLVWOZG
我看了文档,找不到这背后的原因。有人能解释一下这是为什么吗?
我很想知道这一点,因为我想使用1字节的字符集(和相应的排序)而不是4字节的字符集,因为我有一些遗留表(转换为MySQL),有很多列,如果我使用4字节的字符集,它给出了一个错误,行太大。
每个列可以有自己的CHARACTER SET
和COLLATION
。但是不同的行必须一致。
CREATE TABLE
只提供"defaults"对于这些设置——如果在声明单个列时不覆盖它们,则使用这些默认值。
因此,遗留列也可以使用任何旧的字符集来声明。(对不起,EBCDIC不可用)
所有的"printable"ASCII字符在UTF-8 (MySQL的utf8/utf8mb3/utf8mb4)中可用。实际上,二进制编码是相同的。
控制字符"——好吧,坚持使用ASCII或latin1(可能使用latin1_bin)。
任何_bin
排序规则都表示只需查看位。
我不知道当INSERTing
进入UTF-8列时,控制字符是否变成空格(十六进制20)。