声明为 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 恰好适用于梵文,如您的示例所示。
我无法在 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 恰好适用于梵文,如您的示例所示。