我想在我的MySQL数据库中查找非utf8字符,当用户输入addesses通常有其他字符时,尤其是当用户直接从PDF文件复制到输入框时
我尝试了这个,但它给了我所有列无关紧要,如果他们有非utf8字符。是否有SQL查询可以执行此操作并且仅针对非UTF-8字符?
SELECT * FROM MyTable WHERE LENGTH(MyColumn) = CHAR_LENGTH(MyColumn)
这是我的数据库表
table name: employees
emp_num(int)
birth_date(date)
first_name (varchar(15))
last_name (varchar(20))
gender (ENUM('M','F'))
address (varchar(50))
所以我做的是
SELECT * FROM employees WHERE LENGTH(address) = CHAR_LENGTH(address)
不知道这是否正确
这张图片来自我的数据库,看到即将出现的奇怪的Y和其他角色。
答案 0 :(得分:1)
Ÿ
是一个有效的utf8字符(十六进制C5B8
:2个字节,1个字符)。还有一个有效的latin1字符(十六进制9f
)
所以,使用utf8:
mysql> SELECT LENGTH('Ÿ'), CHAR_LENGTH('Ÿ');
+--------------+-------------------+
| LENGTH('Ÿ') | CHAR_LENGTH('Ÿ') |
+--------------+-------------------+
| 2 | 1 |
+--------------+-------------------+
所以,你的测试长度与char_length测试某事,但不测试“非utf8”字符。
事实上,唯一的“非utf8”字符是表情符号以及utf8mb4
但不在utf8
中的一些中文字符。
但也许这不是你想要的问题???
由于你没有提供(1)列的字符集,也没有(2)连接的字符集,也没有提供(3)文本应该说的内容,因此可以诊断的内容是有限制的。
什么是“输入框”?它是一个HTML字段吗?它有吗
<form accept-charset="UTF-8">
使用SELECT HEX(col) ...
向我们展示表格中的当前内容。请参阅here中的“测试数据”,以便对角色的内容进行初步分析。
其他强>
搜索非alphanum:
WHERE col RLIKE '[^a-zA-Z0-9_ ]'
将包含除字母,数字,下划线和空格之外的其他行。
WHERE HEX(col) RLIKE '^(..)*[89ABCDEF]'
将检查第8位的任何字节。也就是说,不完全是7位ascii。
因此,要么更好地指出问题,要么了解REGEXP
。我怀疑“utf8”不是追逐的词。上面的RLIKEs
也会抓住latin1
中的内容。