Skip to content

Can't insert/select NVARCHAR2 column with russian and chinese strings #644

@AndreaPuccia

Description

@AndreaPuccia

Can't insert and select NVARCHAR2 column with russian and chinese strings.

I tried to use python, encoding/nencoding parameters but i can't insert/read NVARCHAR2 column with russian and chinese strings.

These are my settings:

  • Platform: Linux-5.4.0-131-generic-x86_64-with-glibc2.28
  • Python version: 3.9.9
  • Maxsize > 2**32: True
  • Cx-Oracle version: 8.2.1
  • Oracle client version: (19, 11, 0, 0, 0)
  • Oracle db version: 11.2.0.1.0

DB

CREATE TABLE "DI_TEST_TABLE"
   (	
   "LAYER" NVARCHAR2(255), 
   "LINGUA" VARCHAR2(255), 
   "DES" NUMBER(*,0)
   )

SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET')

PARAMETER                      VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET               WE8MSWIN1252
NLS_NCHAR_CHARACTERSET         AL16UTF16

INSERT INTO DI_TEST_TABLE VALUES (n'консэквюат', 'russian', 1)
INSERT INTO DI_TEST_TABLE VALUES (n'面料', 'chinese', 2)

SELECT * FROM DI_TEST_TABLE

LAYER          LINGUA	  DES
-------------- ---------- -------
консэквюат     russian    1
面料            chinese    2

SELECT * FROM DI_TEST_TABLE WHERE LAYER = n'консэквюат'

LAYER          LINGUA	  DES
-------------- ---------- -------
консэквюат     russian    1

PYTHON

import cx_Oracle

conn_config =  {'user': 'my_user', 'password': 'my_password', 'dsn': 'my_dsn', 'encoding': 'UTF-8', 'nencoding': 'UTF-8'}

connection = cx_Oracle.connect(**conn_config)
cursor = connection.cursor()

# INSERT INTO DB
insert_query = "INSERT INTO DI_TEST_TABLE VALUES (:1, :2, :3)"
chunk = [('консэквюат', 'russian', 3),('面料', 'chinese', 4)]

cursor.executemany(insert_query, chunk)
connection.commit()

select_query = "SELECT * FROM DI_TEST_TABLE"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)

# READ 
select_query = "SELECT * FROM DI_TEST_TABLE WHERE LAYER = 'консэквюат'"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)

select_query = "SELECT * FROM DI_TEST_TABLE WHERE LAYER = n'консэквюат'"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)

connection.close()

This is python script output.
When I insert the records with python on the db the question marks (¿) are inserted.
Similarly, when I execute the select, the correct records are not retrieved but those with question marks (¿).

[('консэквюат', 'russian', 1), ('面料', 'chinese', 2), ('¿¿¿¿¿¿¿¿¿¿', 'russian', 3), ('¿¿', 'chinese', 4)]
[('¿¿¿¿¿¿¿¿¿¿', 'russian', 3)]
[('¿¿¿¿¿¿¿¿¿¿', 'russian', 3)]

I tried to use binding params and calling cursor.setinputsizes() , but I need to execute queries without binding params because queries are read from file and chinese/russian strings are embedded into queries.
Is there a way to execute these queries correctly?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions