我正在尝试将char(20)中的值转换为hex varchar(40)。
值为
_ÆúÛlw|™
在我使用hex后,它给了我40char list
5FC386C3BAC39B6C77C2A6E284A2E280B9510C7C
但是根据我的研究,转换并不好。实际的十六进制应该是
5FC6FADB6C77A6998B510C7CDD0419AD221A39D5
问题是,如果所有事情都已到位并使用,十六进制过程没有按计划进行?
我使用了phpmyadmin。使用的命令是
UPDATE tablename SET col2name =hex(col1name);
col2name = varchar(40)
col1name = char(20)
p.s我已经将第一个值带到某个解密站点并使用ASCII到HEX,并使用良好的值进行转换。
答案 0 :(得分:0)
我认为“ASCII to HEX”转换器返回了不同的十六进制表示,因为输入被指定为ASCII而不是UTF-8。
字符串Æ中的第二个字符 似乎是拉丁文大写字母AE diphthong。
显示为HEX的UTF-8编码为 DeliveryGoal = 85%;
。这是MySQL HEX函数返回的内容。
如果MySQL会话正在使用 utf8 characterset,那么似乎MySQL C386
函数返回了我们期望的字符串。 (我只是检查第二个角色。)
看起来观察到的MySQL行为与文档规范一致。
值是CHAR(20),但 characterset 是什么值?从我们看到的,它看起来不像ASCII或扩展ASCII。它看起来像是UTF-8。
参考文献:
绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)
https://www.joelonsoftware.com/articles/Unicode.html
每个程序员绝对需要了解编码和字符集以处理文本
http://kunststube.net/encoding/
关注
HEX
SELECT HEX('_ÆúÛlw¦™‹Q|Ý"9Õ') AS utf8
utf8
------------------------------------------------------
5FC386C3BAC39B6C77C2A6E284A2E280B9517CC39DC2AD2239C395
SELECT HEX(CONVERT('_ÆúÛlw¦™‹Q|Ý"9Õ' USING latin1)) AS latin1
utf8编码
latin1
--------------------------------
5FC6FADB6C77A6998B517CDDAD2239D5
latin1编码
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
如果我们以您说的“正确”的十六进制表示开头,并显示UTF8编码...
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
5F C6 FA DB 6C 77 A6 99 8B 51 7C DD AD 22 39 D5
我们看到该字符串包含四个不可打印的字符。并且该编码需要31个字节,或62个十六进制数字。