mysql中的非ASCII列名称

时间:2015-07-10 20:21:35

标签: mysql utf-8

我可以在数据库的列名中使用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即可修复您的问题。

2 个答案:

答案 0 :(得分: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%值与你的不同,但我认为我们都是"好的"对于这种情况。

在information_schema上尝试使用类似于我所做的选择。

接下来,你的客户是什么? PHP?别的什么?也许客户端的编码不正确。

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

答案 1 :(得分:0)

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

一些可能有用的链接:

charsets上的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

希望这有帮助。