mysql - 如何保存 -

时间:2012-11-21 08:53:57

标签: mysql encoding character-encoding

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

6 个答案:

答案 0 :(得分:5)

例如,使用MySQL WorkBench转到数据库管理,将引擎置于InnoDB,将整理设置为utf8-utf8_general_ci

答案 1 :(得分:5)

您在问题中声明需要ISO-8859-1后端(latin1)和Unicode(UTF-8)前端。这种设置很疯狂,因为前端的设置远大于数据库中允许的设置。 sanest 事物将通过软件堆栈使用相同的编码,但仅使用Unicode进行存储是有意义的。

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

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

  1. 浏览器到HTTP服务器(通常与表单页面编码相同,因此UTF-8。方案通过Content-Type指定。如果缺少,服务器将根据its own strategy选择一个,例如默认为ISO-8859-1或配置参数)
  2. HTTP Server到Java程序(它是Java到Java,所以编码无关紧要,因为我们传递String对象)
  3. Java客户端到MySQL服务器(Connector/J文档非常复杂 - 它使用character_set_server系统变量,可能被characterEncoding连接参数覆盖了)
  4. 要了解问题所在,首先要确保该列实际存储为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版本)

答案 2 :(得分:3)

将db表内容编码更改为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;

答案 3 :(得分:3)

将您的表格整理更改为utf8_spanish_ci

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

utf8_general_ci而不是

答案 4 :(得分:1)

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

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

在dbforge express中检索数据时,显示如下: 尼阿

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

答案 5 :(得分:-2)

我有同样的问题。发现这不是编码UTF-8或任何字符集的问题。我从Windows ANSI导入了我的数据,所有我的Ñ和ñ都完美地放入了数据库。示例姓氏显示在数据库 last_name =“MUÑOZ” 上。我可以通过查询从数据库中选择*从last_name LIKE“%muñoz%” 和phpmyadmin向我显示结果的数据库中正常选择。它没有问题地选择了所有“MUÑOZ”和“ MUNOZ”。因此,phpmyadmin确实显示了我所有的Ñ和ñ没有任何问题

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

然后,我想起了一个旧程序,该程序可以透明地来回操作,并偷看了一下代码以弄清楚:问题在于数据库本身,显示了我所有的特殊字符。记住,我使用Windows ANSI编码上传。 Phpmyadmin符合预期,并按照指示上载了所有内容。

旧程序解决了此问题将Ñ转换为其UNICODE HTML实体:Ñ (请参见此处的图表https://www.compart.com/en/unicode/U+00D1),该过程是从MySQL到Windows应用程式。

因此,您只需要将包含字母Ñ和ñ的数据库字符串更改为它们对应的UNICODE,即可在具有UTF字符集的浏览器中正确反映。

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

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

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