我有一个包含UTF-8字符的数据库,这些字符显示不正确。我想我可以使用UNHEX(HEX(column)) != column
条件来知道哪些字段中有UTF-8字符。结果相当有趣:
id | content | HEX(content) | UNHEX(HEX(content)) LIKE '%c299%' | UNHEX(HEX(content)) LIKE '%FFF%' | UNHEX(HEX(content))
49829102 | | C299 | 0 | 0 | c299
874625485 | FFF | 464646 | 0 | 1 | FFF
这怎么可能呢?我怎么能找到有这个字符的行呢?
--edit(2):由于我的编辑被删除了(可能是在JamWaffles修复我漂亮的数据表时),它又来了:当编辑器去掉UTF-8字符时,第一行的内容是\uc299(如果不清楚的话;)
--edit(3):我已经弄清楚了问题是什么——UNHEX(HEX(content))
的实际表示是错误的——为了显示我的多字节字符,我必须执行以下操作:SELECT UNHEX(SUBSTR(HEX(content),1)))
。遗憾的是,UNHEX(C299)不能像UNHEX(C2)+UNHEX)那样工作,所以它又回到了绘图板上。
有两种方法可以确定字符串是否包含UTF-8特定字符。第一个是查看字符串是否具有ASCII字符集之外的值:
SELECT _utf8 'amńbcd' REGEXP '[^[.NUL.]-[.DEL.]]';
第二个是比较二进制和字符长度:
SELECT LENGTH(_utf8 'amńbcd') <> CHAR_LENGTH(_utf8 'amńbcd');
两者都返回TRUE
。
请参阅http://sqlfiddle.com/#!2/d41d8/9811