我正在尝试将char(20)中的一个值转换为十六进制varchar(40)。
该值为
_™‹Q |"9">
在我使用十六进制后,它给了我40char列表
5FC386C3BAC39B6C77C2A6E284A280B9510C7C
但根据我的研究,转换并不好。实际的十六进制应该是
5FC6FADB6C77A6998B510C7CDD419D221A39D5
问题是,如果所有东西都到位并使用了,为什么十六进制过程没有按计划进行?
我使用了phpmyadmin。使用的命令是
UPDATE tablename SET col2name =hex(col1name);
col2name=varchar(40)
col1name=char(20)
我已经把第一个值带到一些解密站点,并使用ASCII到HEX,它转换成了好的值。
我认为"ASCII到HEX"转换器返回了不同的十六进制表示,因为输入被指定为ASCII而不是UTF-8。
字符串Æ中的第二个字符似乎是拉丁文大写AE双元音。
其UTF-8编码显示为HEX,是C386
。这就是MySQL HEX函数返回的内容。
如果MySQL会话使用utf8字符集,那么MySQLHEX
函数似乎返回了我们期望的字符串。(我只检查了第二个字符。)
观察到的MySQL行为似乎与文档规范一致。
值是CHAR(20),但该值在哪个字符集中?从我们看到的情况来看,它看起来不像ASCII或扩展ASCII。它看起来是UTF-8。
参考文献:
绝对最小值每个软件开发人员绝对、积极地必须了解Unicode和字符集(没有借口!)
https://www.joelonsoftware.com/articles/Unicode.html
每个程序员都需要了解的关于使用文本的编码和字符集的信息
http://kunststube.net/encoding/
跟进
SELECT HEX('_ÆúÛlw¦™‹Q|Ý"9Õ') AS utf8
utf8
------------------------------------------------------
5FC386C3BAC39B6C77C2A6E284A2E280B9517CC39DC2AD2239C395
SELECT HEX(CONVERT('_ÆúÛlw¦™‹Q|Ý"9Õ' USING latin1)) AS latin1
latin1
--------------------------------
5FC6FADB6C77A6998B517CDDAD2239D5
utf8编码
HEX('_') HEX('Æ') HEX('ú') HEX('Û') HEX('l') HEX('w') HEX('¦') HEX('™')
-------- -------- -------- --------- -------- -------- -------- --------
5F C386 C3BA C39B 6C 77 C2A6 E284A2
HEX('‹') HEX('Q') HEX('|') HEX('Ý') HEX('') HEX('"') HEX('9') HEX('Õ')
-------- -------- -------- -------- -------- -------- -------- ---------
E280B9 51 7C C39D C2AD 22 39 C395
latin1编码
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
5F C6 FA DB 6C 77 A6 99 8B 51 7C DD AD 22 39 D5
如果我们从你说的"正确"的十六进制表示开始,并显示其UTF8编码。。。
SELECT HEX(CONVERT(CONVERT(UNHEX('5FC6FADB6C77A6998B510C7CDD0419AD221A39D5') USING latin1) USING utf8))
-- ---- ---- ---- -- -- ---- ------ ------ -- -- -- ---- -- -- ---- -- -- -- ----
5F C386 C3BA C39B 6C 77 C2A6 E284A2 E280B9 51 0C 7C C39D 04 19 C2AD 22 1A 39 C395
^^ ^^ ^^ ^^
我们看到字符串包含四个不可打印的字符。这种编码需要31个字节,即62个十六进制数字。