2012-11-21 35 views
3

每当我尝试保存ñ它就会变成mysql数据库中的?。经过一些读数后,建议我必须将我的jsp字符集更改为UTF-8。由于某些原因,我必须坚持ISO-8859-1。我的数据库表编码是latin1。我怎样才能解决这个问题?请帮忙。mysql - 如何保存ñ

+1

您的表编码改为UTF – swapnesh

+0

当您检索值仍然'?'或打印作为'N'?它可能是您用来查看数据库的程序的字符集问题,但对您的应用程序来说不是问题。 –

+0

@CarlosCampderrós当我检查我的数据库表时,它显示? – TheOnlyIdiot

回答

3

更改数据库表的内容编码成UTF-8

下面是整个数据库转换

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

的命令,这是单个表转换

ALTER TABLE db_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 
+0

我试过但仍然一样。我什至重新启动我的MySQL。 – TheOnlyIdiot

3

改变你的桌子整理到utf8_spanish_ci

其中ñ不等于n但如果你想两个字符等于使用

utf8_general_ci,而不是

+0

OP问题实际上并不是我正在寻找的,我遇到了一个问题,charÑ被保存为N,这是因为我的表使用了collat​​e utf8_general_ci。 – emerino

5

转到您的数据库管理与MySQL WorkBench例如,把引擎InnoDB和整理,以utf8-utf8_general_ci

+0

我试过了,但还是一样的。我什至重新启动我的MySQL。 – TheOnlyIdiot

4

你在你的问题中声明你需要一个ISO-8859-1后端(latin1)和一个Unicode(UTF-8)前端。这个设置很疯狂,因为前端的设置比数据库中允许的大得多。通过软件堆栈将使用相同的编码,但也只使用Unicode来存储将是有道理的。

正如您应该知道的那样,字符串是一个字符序列的人类概念。在计算机程序中,字符串是而不是即:它可以是查看作为字符序列,但它确实是一对数据结构:字节流和编码

一旦你明白,传递字符串是真正传递字节和方案,让我们看看谁发送的内容:

  1. 浏览器HTTP服务器(通常是相同的编码形式的网页,所以UTF-8计划通过Content-Type指定。如果缺失,服务器将根据its own strategy选择一个,例如默认为ISO-8859-1或配置参数)
  2. HTTP服务器到Java程序(它是Java到Java,所以编码并不重要,因为我们通过String对象)
  3. Java客户端到MySQL服务器(Connector/J文档相当令人费解 - 它使用character_set_server系统变量,可能由characterEncoding连接参数覆盖)

要了解问题所在,首先保证该列确实存储为latin1:

SELECT character_set_name, collation_name 
    FROM information_schema.columns 
    WHERE table_schema = :DATABASE 
     AND table_name = :TABLE 
     AND column_name = :COLUMN; 

然后写你从请求到一个日志文件获取Java字符串:

logger.info(request.getParameter("word")); 

最后看到的是居然在列:

SELECT HEX(:column) FROM :table 

在这一点上,你会有足够的信息来了解问题。如果它真的是一个问号(而不是replacement character),那么它可能是MySQL试图从一个更大的集合(比如说Unicode)中将一个字符转码为一个不包含它的较窄字符。这里奇怪的是ñ belongs to both ISO-8859-1(0xF1,十进制241)和Unicode(U + 00F1),所以它似乎有一个往返行程涉及的第三个字符集(也许是代码页?)。

更多的信息可以帮助(操作系统,HTTP服务器,MySQL版本)

+0

为什么我可以在latin1字段上手动保存ñ字母,但是在将其转换为二进制文件后,由于“未知字符串”错误1366,转换为utf8_general_ci失败?我可以完美地将它看作 - 当保存在表中时,但转换为二进制文件,然后转换为utf8失败。 – andreszs