【问题标题】:Non ASCII colum name in mysqlmysql中的非ASCII列名
【发布时间】:2015-09-29 17:26:17
【问题描述】:

我可以在数据库的列名中使用 UTF-8 名称吗?就像这里的例子:

$zapytaj = mysql_query("SELECT * FROM users WHERE `użytkownicy` = '$nazwaużytkownika' ");

这给了我错误:

“where 子句”中的未知列“użytkownicy”

有人可以解释为什么这不起作用吗?

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-------------
| Variable_name            | Value
+--------------------------+-------------
| character_set_client     | utf8mb4
| character_set_connection | utf8mb4
| character_set_database   | utf8mb4
| character_set_filesystem | binary
| character_set_results    | utf8mb4
| character_set_server     | latin1
| character_set_system     | utf8

mysql> SELECT COLUMN_NAME, HEX(COLUMN_NAME)
    FROM information_schema.columns WHERE table_name = "so31349641";
+--------------+--------------------------+
| COLUMN_NAME  | HEX(COLUMN_NAME)         |
+--------------+--------------------------+
| id           | 6964                     |
| użytkownicy  | 75C5BC79746B6F776E696379 | -- Note the C5BC for ż
| hasło        | 686173C5826F             | -- and the C582 for ł
+--------------+--------------------------+

如果我从 użytkownicy 中删除 `` 我会看到以下错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '�ytkownicy = 'xxx'' at line 1 也许PHP文件没有UTF8编码?如何在 PHPStorm 中查看这个文件?

!SOLUTION!

如果您遇到此错误,只需将 mysql 更改为 PDO 即可解决您的问题。

【问题讨论】:

  • 你使用的是什么字符集?
  • 请提供SHOW CREATE TABLE users;
  • @RickJames CREATE TABLE users (id int(11) NOT NULL AUTO_INCREMENT, użytkownicy varchar(24) NOT NULL, hasło varchar(24) NOT NULL,主键 (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4

标签: mysql utf-8


【解决方案1】:

为了回答您提出的问题,列名是 utf8:

mysql> SHOW CREATE TABLE information_schema.columns\G
*************************** 1. row ***************************
       Table: COLUMNS
Create Table: CREATE TEMPORARY TABLE `COLUMNS` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `COLUMN_NAME` varchar(64) NOT NULL DEFAULT '',           -- NOTE --
  `ORDINAL_POSITION` bigint(21) unsigned NOT NULL DEFAULT '0',
  `COLUMN_DEFAULT` longtext,
  `IS_NULLABLE` varchar(3) NOT NULL DEFAULT '',
  `DATA_TYPE` varchar(64) NOT NULL DEFAULT '',
  `CHARACTER_MAXIMUM_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `CHARACTER_OCTET_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `NUMERIC_PRECISION` bigint(21) unsigned DEFAULT NULL,
  `NUMERIC_SCALE` bigint(21) unsigned DEFAULT NULL,
  `DATETIME_PRECISION` bigint(21) unsigned DEFAULT NULL,
  `CHARACTER_SET_NAME` varchar(32) DEFAULT NULL,
  `COLLATION_NAME` varchar(32) DEFAULT NULL,
  `COLUMN_TYPE` longtext NOT NULL,
  `COLUMN_KEY` varchar(3) NOT NULL DEFAULT '',
  `EXTRA` varchar(30) NOT NULL DEFAULT '',
  `PRIVILEGES` varchar(80) NOT NULL DEFAULT '',
  `COLUMN_COMMENT` varchar(1024) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8

要找到隐含问题的根源(“为什么查询失败”),让我们看看

SHOW VARIABLES LIKE 'character%';

编辑

嗯,发生了一些不明显的事情。这对我有用:

mysql> create table so31349641 (
    id int(11) NOT NULL AUTO_INCREMENT, 
    użytkownicy varchar(24) NOT NULL, 
    hasło varchar(24) NOT NULL, PRIMARY KEY (id)
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

mysql> INSERT INTO so31349641 VALUES (1, 'a', 'b');

mysql> SELECT * FROM so31349641 WHERE użytkownicy = 'a';
+----+--------------+--------+
| id | użytkownicy  | hasło  |
+----+--------------+--------+
|  1 | a            | b      |
+----+--------------+--------+

这看起来很普通:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+-------------
| Variable_name            | Value
+--------------------------+-------------
| character_set_client     | utf8
| character_set_connection | utf8
| character_set_database   | latin1
| character_set_filesystem | binary
| character_set_results    | utf8
| character_set_server     | latin1
| character_set_system     | utf8

查看 IS:

mysql> SELECT COLUMN_NAME, HEX(COLUMN_NAME)
    FROM information_schema.columns WHERE table_name = "so31349641";
+--------------+--------------------------+
| COLUMN_NAME  | HEX(COLUMN_NAME)         |
+--------------+--------------------------+
| id           | 6964                     |
| użytkownicy  | 75C5BC79746B6F776E696379 | -- Note the C5BC
| hasło        | 686173C5826F             | -- and the C582 for ł
+--------------+--------------------------+

正如我所料。

我的 char% 值与你的不同,但我认为在这种情况下我们都“OK”。

在 information_schema 上尝试 SELECT,类似于我所做的。

接下来,你的客户是什么? php?还有什么?可能客户端的编码不正确。

(与其尝试在评论中使用 HTML 标记,不如使用添加的信息编辑您的原始问题。)

【讨论】:

  • 我的客户端是 MySQL 5.6.24 。我通过 PHP 文件 index.php 将此查询通过 POST 发送到 login.php。在 PHPMyAdmin 您的查询也对我有用,但在 PHP 文件中不起作用。十六进制名称与您的相同。
  • 在 PHPStorm 中找到连接的代码。它可能(错误地)使用latin1
  • $zapytaj = mysql_query("SELECT * FROM users` WHERE so31349641 = '$nazwaużytkownika'");`
  • 这不是连接。此外,您可能需要切换到mysqli_* 接口。 mysql_* 在 ut8f 实施时已被弃用;可能是有原因的。
  • 是的,你说得对。我只是使用 PDO,所以这个修复对我来说。一切正常。谢谢你瑞克。
【解决方案2】:

看起来SQL中的UTF-8不是默认的,但是表/数据库可以改成这样。

一些可能有用的链接:

有关字符集的 mySQL 文档: https://dev.mysql.com/doc/refman/5.0/en/charset.html

关于确定字符集的 SO 问题: determining the character set of a table / database?

关于更改字符集:http://makandracards.com/makandra/2529-show-and-change-mysql-default-character-set

希望这会有所帮助。

【讨论】:

  • 他使用的是 utf8mb4(完全支持 UTF-8),而不是 utf8_general_ci,后者主要涵盖拉丁字符集
  • Latin1 没有ż。 utf8 和 utf8mb4 有它作为十六进制 C5BC
  • @RickJames 那么如果我想使用 ż 该怎么办??
  • 在所有阶段使用 utf8mb4。变量、表定义、客户端编码等
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 2014-06-12
  • 2015-04-07
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多