每当我尝试将其保存在 mysql 数据库中ñ
时。?
经过几次阅读后,建议我必须将我的 jsp 字符集更改为UTF-8
. 由于某些原因,我必须坚持ISO-8859-1
. 我的数据库表编码是latin1
. 我怎样才能解决这个问题?请帮忙。
6 回答
您在问题中声明您需要一个 ISO-8859-1 后端 (latin1) 和一个 Unicode (UTF-8) 前端。这个设置很疯狂,因为前端的设置比数据库中允许的要大得多。最明智的做法是通过软件堆栈使用相同的编码,但仅将 Unicode 用于存储也是有意义的。
如您所知,字符串是字符序列的人类概念。在计算机程序中,字符串不是这样的:它可以被视为一个字符序列,但它实际上是一对数据结构:一个字节流和一个编码。
一旦你明白传递一个字符串实际上是传递字节和一个方案,让我们看看谁发送了什么:
- 浏览器到 HTTP 服务器(通常与表单页面相同的编码,因此 UTF-8。方案通过 指定
Content-Type
。如果缺少,服务器将根据自己的策略选择一个,例如默认为 ISO-8859-1 或配置范围) - HTTP 服务器到 Java 程序(它是 Java 到 Java,所以编码无关紧要,因为我们传递 String 对象)
- 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 版本)
转到您的数据库管理,MySQL WorkBench
例如,将引擎放入并将InnoDB
排序规则放入utf8-utf8_general_ci
.
将您的数据库表内容编码更改为 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;
将您的表格整理更改为utf8_spanish_ci
whereñ
不等于,n
但如果您希望两个字符相等,请使用
utf8_general_ci
反而
我尝试了几种组合,但这对我有用:
VARCHAR(255) 二进制字符集 utf8 整理 utf8_bin
在 dbforge express 中检索数据时,显示如下:NIÃ'A
但在应用程序中显示如下:NIÑA
我有同样的问题。发现这不是关于编码 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');
现在,我能够显示、浏览、甚至搜索我所有正确的姓氏和口音/波浪号,适合西班牙语。我希望这有帮助。解决这个问题很痛苦,但一个旧程序解决了这个问题。最好的问候和快乐的编码!