【问题标题】:MySQL does not identify character '?' on selectMySQL 不识别字符 '?'选择时
【发布时间】:2015-03-17 22:45:07
【问题描述】:

我在 MySQL 中有一个包含以下列的表:

id     name   email    address   borningDate

我在 HTML 页面中有一个表单,该表单将此数据提交给 servlet,负责将其保存在数据库中。由于字符集问题(已经修复),我在尝试存储带有重音符号的字母时保存了这样的一行:

19        ?        ?       ?      2015-03-01

现在我想删除这一行。

是的,这样做:

DELETE FROM table WHERE id=19;

效果很好。我的教学问题是:为什么,如果我尝试这样的事情:

DELETE FROM table WHERE name='?';

它返回0 rows affected,就像它无法将? 视为有效字符一样?

【问题讨论】:

  • SELECT HEX(name), name FROM table WHERE ... -- 这样我们就可以看到该字段中有什么。
  • 你确定字段内也没有空格吗?

标签: mysql database select character-encoding


【解决方案1】:

尝试做

SELECT id, HEX(name), HEX(email), HEX(address), borningDate FROM table

这将告诉您数据库中的实际内容。它可能实际上不是 ASCII 问号。问号可能是 MySQL 尝试将列的字符集转换为连接的字符集时应用的替换字符。

要更具体地管理此问题,请执行SHOW CREATE TABLE table 并查找用于文本列的字符集。这可能在表定义的末尾显示为DEFAULT CHARSET utf8 或类似的东西。但它可能在列定义中指定。

知道字符集后,发出命令SET NAMES charset,例如SET NAMES utf8。然后重新发出你的命令,看看你是否得到比? 替换字符更好的结果。当然,这假设您使用的客户端程序可以处理提到的字符集。

【讨论】:

  • SET NAMES charset 必须匹配客户端字符集,而不是表字符集。所以答案的第二部分根本不正确。
  • @zerkms 不完全是。这是一种故障排除技术。我不建议使用此字符集选择投入生产。
  • "这是一种故障排除技术。" --- 您无法使用随机不可预测的步骤进行故障排除。对于表和客户端的任意组合,SET NAMES table_character_set 的结果是不可预测的。老实说,我不敢相信有人会建议认真地这样做。正确的解决方案是查看数据是如何插入的——这样你就可以确定发生了什么(以及数据究竟是如何被破坏的)。没错——这将是在几分钟内获得的可靠信息。但是,嘿,做一些有效的事情并不有趣,是吗? :-D
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2011-03-29
  • 2016-11-19
  • 2018-07-15
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多