声明为 NVARCHAR 的列在 MySQL 中创建为 VARCHAR。 VARCHAR 和 NVARCHAR 声明都可以存储非拉丁字符

Column declared as NVARCHAR gets created as VARCHAR in MySQL. Both VARCHAR AND NVARCHAR declaration can store non latin characters

我无法在 MySQL 中创建 NVARCHAR 数据类型。

我有以下查询 -

CREATE TABLE table1 ( column1 NVARCHAR(10) );

这应该创建存储数据类型 NVARCHAR(10)column1。但是查询 -

DESCRIBE table1;

给我输出 -

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column1 | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

因此,创建的不是可以存储 NVARCHAR(10) 数据类型的 column1,而是可以存储 VARCHAR(10) 数据类型的 column1。

现在只有 NVARCHAR 数据类型可以存储非拉丁字符。

但是查询-

INSERT INTO table1 VALUES ("भारत");

运行成功,没有任何错误。这里的“भारत”是梵文脚本中的印地语单词,在英语中发音为“Bharat”,t运行slates 为“India”。

查询-

SELECT * FROM table1;

按预期显示 -

+--------------+
| column1      |
+--------------+
| भारत         |
+--------------+

我猜可能 MySQL 在内部将 VARCHAR 视为 NVARCHAR。但我找不到任何说明如此的文档。

以下是来自MySQL开发者网站的link-

https://dev.mysql.com/doc/refman/8.0/en/charset-national.html

这里说完全支持NVARCHAR

要查明是否可以将非拉丁字符存储在定义为 VARCHAR 的列中,我 运行 以下查询 -

CREATE TABLE table2 ( column2 VARCHAR(10) );
DESCRIBE table2;

这给了我输出 -

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

此处可以存储 VARCHAR(10) 数据类型的 column2 按预期创建。

运行查询-

INSERT INTO table2 VALUES ("भारत");

运行没有任何错误。

和查询 -

SELECT * FROM table2;

给出预期的输出 -

+--------------+
| column2      |
+--------------+
| भारत         |
+--------------+

因此,即使我将 column2 声明为 VARCHAR(10),我也可以成功存储非拉丁字符(这里是印地语的 Devanagari 字符)。

最合乎逻辑的结论是,无论将列声明为 VARCHAR 还是 NVARCHAR,MySQL 始终在内部将其存储为 NVARCHAR。但是我找不到任何相关的文档。

以下 Whosebug 问题最接近我的问题 -

Issue Converting varchar to nvarchar mysql

但是没有提供问题的答案。

我正在使用操作系统 Ubuntu 20.04 和 MySQL 版本 - 8.0.26

字符集和排序规则中可以保存哪些信息。

因为默认是 utf8,所以 bith 可以在他们的 4 个字节中保存印地文或中文或 kisuali

但是

CREATE TABLE table1 ( column1 NVARCHAR(10),column2 VARCHAR(10) );

实际处理略有不同

CREATE TABLE `table1` (
  `column1` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `column2` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

在示例数据库中默认为

DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

但是国家的varchar就像标准定义的那样

CHARACTER SET utf8 COLLATE utf8_general_ci

对于您的印地语单词“भारत”没有区别,但对于某些字符可能会有“问题”

养成使用 SHOW CREATE TABLE 而不是 DESCRIBE 的习惯。它会回答你的问题。

mysql> CREATE TABLE nv ( column1 NVARCHAR(10) );
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> show warnings;
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                                                                                                                           |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 3720 | NATIONAL/NCHAR/NVARCHAR implies the character set UTF8MB3, which will be replaced by UTF8MB4 in a future release. Please consider using CHAR(x) CHARACTER SET UTF8MB4 in order to be unambiguous. |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE nv\G
*************************** 1. row ***************************
       Table: nv
Create Table: CREATE TABLE `nv` (
  `column1` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
1 row in set (0.00 sec)

如果您尝试在列中存储中文或表情符号,警告会提示您一个重要问题。需要utf8mb4

所以,你应该说

CREATE TABLE nv ( column1 VARCHAR(10) CHARACTER SET utf8mb4 );

即不要使用NVARCHAR,使用VARCHAR并指定合适的字符集。

utf8 恰好适用于梵文,如您的示例所示。