3

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

4

6 回答 6

5

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

如您所知,字符串是字符序列的人类概念。在计算机程序中,字符串不是这样的:它可以被视为一个字符序列,但它实际上是一对数据结构:一个字节流和一个编码

一旦你明白传递一个字符串实际上是传递字节和一个方案,让我们看看谁发送了什么:

  1. 浏览器到 HTTP 服务器(通常与表单页面相同的编码,因此 UTF-8。方案通过 指定Content-Type。如果缺少,服务器将根据自己的策略选择一个,例如默认为 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

此时,您将有足够的信息来理解问题。如果它真的是一个问号(而不是替换字符),很可能是 MySQL 试图将一个字符从一个更大的集合(比如说 Unicode)转码为一个不包含它的更窄的字符。这里奇怪的是ñ同时属于ISO-8859-1(0xF1,十进制241)和Unicode(U+00F1),所以看起来好像有第三个字符集(可能是代码页?)参与往返.

更多信息可能会有所帮助(操作系统、HTTP 服务器、MySQL 版本)

于 2012-11-21T13:17:59.450 回答
5

转到您的数据库管理,MySQL WorkBench例如,将引擎放入并将InnoDB排序规则放入utf8-utf8_general_ci.

于 2012-11-21T08:59:16.087 回答
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;
于 2012-11-21T08:55:37.793 回答
3

将您的表格整理更改为utf8_spanish_ci

whereñ不等于,n但如果您希望两个字符相等,请使用

utf8_general_ci反而

于 2012-11-21T08:55:39.093 回答
1

我尝试了几种组合,但这对我有用:

VARCHAR(255) 二进制字符集 utf8 整理 utf8_bin

在 dbforge express 中检索数据时,显示如下:NIÃ'A

但在应用程序中显示如下:NIÑA

于 2018-07-03T14:32:44.127 回答
-2

我有同样的问题。发现这不是关于编码 UTF-8 或任何字符集的问题。我从 Windows ANSI 导入了我的数据,我所有的 Ñ 和 ñ 都按原样完美地放入了数据库中。示例姓氏显示在数据库last_name = "MUÑOZ"上。我能够从数据库中正常选择查询Select * from database where last_name LIKE "%muñoz%"和 phpmyadmin 显示结果很好。它毫无问题地选择了所有“MUÑOZ”和“MUNOZ”。所以 phpmyadmin 确实显示了我所有的 Ñ 和 ñ没有任何问题

问题出在程序本身。我提到的所有角色,正如你所描述的那样,带有时髦的“MU�OZ”问号。我到处都听从了所有的建议。正确设置我的标题并尝试了我所有可用的字符集。甚至使用谷歌字体和任何可用的字体来正确显示这些姓氏,但没有成功。

然后我想起了一个旧程序,它能够透明地来回执行这个技巧,然后偷看代码来弄清楚:数据库本身,显示我所有的特殊字符是问题所在。请记住,我使用 Windows ANSI 编码上传。phpmyadmin按预期进行,按指示上传。

旧程序修复了将 Ñ 转换为其 UNICODE HTML 实体的问题:(Ñ参见此处的图表https://www.compart.com/en/unicode/U+00D1)从 MySQL 到应用程序的来回过程。

因此,您只需将包含字母 Ñ 和 ñ 的数据库字符串更改为它们对应的 UNICODE,以便使用 UTF 字符集正确反映在您的浏览器上。

就我而言,我解决了我的问题,将我的所有 Ñ 和 ñ 替换为我数据库中所有姓氏中对应的 UNICODE。

UPDATE database_name
SET 
    last_name = REPLACE(last_name,
        'MUÑOZ',
        'MUÑOZ');

现在,我能够显示、浏览、甚至搜索我所有正确的姓氏和口音/波浪号,适合西班牙语。我希望这有帮助。解决这个问题很痛苦,但一个旧程序解决了这个问题。最好的问候和快乐的编码!

于 2018-12-03T22:19:15.640 回答